如果数据框中包含2种观察类型,则按ID(id.1
,id.2
)编码,并带有相应的值(val.1
,val.2
)和其他几种此示例中由val.other
表示的数据。
set.seed(1)
# df.master
id.1= c("abc", "def", "ghi", "jkl")
val.1= c(1, 2, 3, 4)
id.2= c("mno", "pqr", "stu", "vwx")
val.2= c(5, 6, 7, 8)
val.other= rep(runif(1),4)
df.master= data.frame(id.1, id.2, val.other, val.1, val.2)
df.master
看起来像:
id.1 id.2 val.other val.1 val.2
1 abc mno 0.2655087 1 5
2 def pqr 0.2655087 2 6
3 ghi stu 0.2655087 3 7
4 jkl vwx 0.2655087 4 8
我生成的新数据分别存储在第2和第3个数据框df.new.1
和df.new.2
中。
df.new.1
看起来像:
id.3 val.3
1 abc 10
2 ghi 20
3 stu 30
# Create an 2nd data frame, which contains new values
id.3= c("abc", "ghi", "stu")
val.3= c(10, 20, 30)
df.new.1= data.frame(id.3, val.3)
df.new.2
看起来像:
id.4 val.4
1 def 100
2 vwx 200
# Create an 3rd data frame, which contains new values
id.4= c("def", "vwx")
val.4= c(100, 200)
df.new.2= data.frame(id.4, val.4)
我想根据df.master
和df.new.1
的内容更新df.new.2
,同时保持df.master
的原始结构导致以下结果:
id.1 id.2 val.other val.1 val.2
1 abc mno 0.2655087 10 5
2 def pqr 0.2655087 100 6
3 ghi stu 0.2655087 20 30
4 jkl vwx 0.2655087 4 200
请注意,df.new.1
和df.new.2
包含id.1
id.2
和df.master
df.master
的新数据。
有关代码执行{{1}}更新的建议吗?
答案 0 :(得分:2)
以下内容可能会有所帮助:
ids_mat = as.matrix(df.master[c("id.1", "id.2")])
mat_inds = arrayInd(match(df.new.1$id.3, ids_mat), dim(ids_mat))
df.master[c("val.1", "val.2")][mat_inds] <- df.new.1$val.3
df.master
# id.1 id.2 val.other val.1 val.2
#1 abc mno 0.2655087 10 5
#2 def pqr 0.2655087 2 6
#3 ghi stu 0.2655087 20 30
#4 jkl vwx 0.2655087 4 8
df.new.2
的逻辑相同。
答案 1 :(得分:1)
如果您在df.master的第二列中有两次相同的ID,则此代码将无法正常运行(更改两者)
for(i in 1:length(df.new.1[,1])){
tmp <- grep(pattern=df.new.1[i,1], x=df.master[,1])
if(length(tmp)==1){ # if found anything
df.master[tmp,4] <- df.new.1[i,2]
}
tmp <- grep(pattern=df.new.1[i,1], x=df.master[,2])
if(length(tmp)==1){ # if found anything
df.master[tmp,5] <- df.new.1[i,2]
}
}