用新数据框替换数据框中的特定值

时间:2016-06-17 09:38:53

标签: r data.table dplyr

这是原始数据框:

> 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

我尝试使用setcbind,但没有效果。 有什么想法吗?

欢迎

dplyrdata.table解决方案。需要一个适用于包含> 100列的数据框的解决方案。

2 个答案:

答案 0 :(得分: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'))

创建要更改的列向量('nm1'),加入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

答案 1 :(得分:0)

这是一个可用于所有不同类型数据帧之间所有这些替换的函数

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)
 }

}

函数args如下:

dataframe1 =要替换

值的数据框

dataframe2 =要在替换第一个参数的值时使用值的数据框

vec =您不想替换的行。

通读代码,我可能会遇到一些错误,但主要逻辑是正确的。如果我的函数有一些机械错误,你可以在你自己的函数中应用这个逻辑,我相信我会帮助你至少以这种方式。

正如您所看到的,该功能将自动调整为列和行,无需您的努力。

请记住使用as.NA is.Na和其他NA fxns来填充具有较短行的NA的行,该行是如何在R编程软件中使用内置函数调整行的,你可以在上面的功能代码中实现这个功能,这是你自己的选择。

  replace_frame_with(df,newdf,c(1,3))