2016-06-17 4 views
2

Это оригинальный кадр данных:Замена конкретных значений в кадре данных с новым кадром данных

> df = data.frame(name=c('a', 'b', 'c'), age = c(12, 23, 34), sex = c('boy', 'girl', 'boy')) 
> df 
    name age sex 
1 a 12 boy 
2 b 23 girl 
3 c 34 boy 

И этот фрейм данных содержит значение мне нужно изменить:

> newdf = data.frame(name=c('a', 'c'), sex=c('girl', 'girl')) 
> newdf 
    name sex 
1 a girl 
2 c girl 

мне нужно замените значения в df со значениями в newdf.

Ожидаемые результаты должны быть:

> expectedResult = data.frame(name=c('a', 'b', 'c'), age=c(12, 23, 34), sex=c('girl', 'girl', 'girl')) 
> expectedResult 
    name age sex 
1 a 12 girl 
2 b 23 girl 
3 c 34 girl 

Я попытался с помощью set или cbind, но не работает. Любая идея?

dplyr или data.table решения приветствуются. Нужно решение, которое работает для фрейма данных с> 100 столбцами.

ответ

3

Мы можем присоединиться к on 'name' и присвоить значения 'i.sex' 'sex'.

library(data.table) 
setDT(df)[newdf, sex:= i.sex , on = 'name'] 
df 
#  name age sex 
#1: a 12 girl 
#2: b 23 girl 
#3: c 34 girl 

Если существует несколько столбцов, например, путем изменения 'newdf'

newdf = data.frame(name=c('a', 'c'), age = c(14, 22), sex=c('girl', 'girl')) 

Создать вектор столбцов для изменения ('нм1'), присоединиться к on 'имя', используйте mget, чтобы получить столбцы i. в list и присвоить выход «nm1».

nm1 <- c("sex", "age") 
setDT(df)[newdf, (nm1) := mget(paste0("i.", nm1)), on = 'name'] 
df 
# name age sex 
#1: a 14 girl 
#2: b 23 girl 
#3: c 22 girl 
+0

Что делать, если у меня есть несколько столбцов? Я пробовал цикл для i.col, но не работал. – shawnl

+0

@shawni Затем используйте 'c ('sex', 'something'): = list (i.sex, i.something)' – akrun

+0

Как я могу сделать его динамическим, например 'i.col'? Это должно быть решение, которое работает для фрейма данных с> 100 столбцами. – shawnl

0

Вот функция, которую вы можете использовать для всех этих видов замен между всеми различными видами dataframes

replace_frame_with <- function(dataframe1,dataframe2,vec){ 

myvector <- colnames(out) 
yourvector <- colnames(out2) 
out <- dataframe1[vec,] 
out2 <- dataframe2[vec,] 

if(ncols(out)>ncols(out2)){ 
    cols_to_exchange <- myvector[myvector==yourvector] 
    out[,cols_to_exchange] <- out2[,cols_to_exchange] 
    return(out) 
} 

if(ncols(out2)>ncols(out)){ 
    cols_to_exchange <- yourvector[yourvector==myvector] 
    out[,cols_to_exchange] <- out2[,cols_to_exchange] 
    return(out) 
} 

} 

Функция арг следующим образом:

dataframe1 = кадр данных, вы хотите заменить значения

dataframe2 = кадр данных, который вы хотите использовать значениями при замене значения первого аргумента

vec = строки, которые вы не замените.

Прочитайте код, возможно, у меня есть некоторые ошибки, но основная логика верна. Вы можете применить эту логику в своей собственной функции, если у моей функции есть некоторые механические ошибки, я полагаю, что помогу вам хотя бы таким образом.

Как вы можете видеть, функция будет автоматически регулироваться колонками и строками, не требуя от вас усилий.

Помните, что использовать as.NA is.Na и другие NA fxns для заполнения строк NA с более короткими строками, так как вы можете отрегулировать строки со встроенными функциями в программном обеспечении R , вы можете реализовать эту функцию в коде функции выше, это все, что вам нужно, это зависит от вас.

replace_frame_with(df,newdf,c(1,3)) 
Смежные вопросы