这是原始数据框:
> 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列的数据框的解决方案。
答案 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))