R:用类似名称的较小df修补df

时间:2017-10-27 14:32:19

标签: r dataframe merge

我有2个数据框,第二个有一个colnales的子集和第一个的rownames:

df1 = as.data.frame(matrix(ncol = 5, nrow = 5))
colnames(df1) = c('c1','c2','c3','c4','c5')
rownames(df1) = c('r1','r2','r3','r4','r5')

df2 = as.data.frame(matrix(data = 1, ncol = 2, nrow = 2))
colnames(df2) = c('c2','c3')
rownames(df2) = c('r2','r3')

现在我想用df1修补df2来获取此信息:

   c1 c2 c3 c4 c5
r1 NA NA NA NA NA
r2 NA  1  1 NA NA
r3 NA  1  1 NA NA
r4 NA NA NA NA NA
r5 NA NA NA NA NA

如果我使用merge,则列号命令会混淆,不同的by选项会显示重复的行或列。我该如何避免这种情况?在R中是否有一种简单的方法来修补数据框而不改变其结构?

我只能想到一个基于循环的解决方案,但我希望有一个单线程。

for (i in rownames(df2)){
    for (j in colnames(df2)){
      df1[i,j] = df2[i,j]
    }
  }

2 个答案:

答案 0 :(得分:2)

这是一个选项。感谢akrun的建议。

df1[rownames(df2), colnames(df2)] <- df2
df1
   c1 c2 c3 c4 c5
r1 NA NA NA NA NA
r2 NA  1  1 NA NA
r3 NA  1  1 NA NA
r4 NA NA NA NA NA
r5 NA NA NA NA NA

答案 1 :(得分:1)

让我们假设rownames和colnames没有相同的顺序:

df1 = as.data.frame(matrix(ncol = 5, nrow = 5))
colnames(df1) = c('c1','c3','c2','c4','c5')
rownames(df1) = c('r1','r3','r2','r4','r5')

df2 = as.data.frame(matrix(data = c(1,2,3,4), ncol = 2, nrow = 2))
colnames(df2) = c('c2','c3')
rownames(df2) = c('r2','r3')

然后下面的代码似乎引用了正确的列和行:

> df1
   c1 c3 c2 c4 c5
r1 NA NA NA NA NA
r3 NA NA NA NA NA
r2 NA NA NA NA NA
r4 NA NA NA NA NA
r5 NA NA NA NA NA
> df2
   c2 c3
r2  1  3
r3  2  4
> df1[rownames(df2),colnames(df2)] <- df2
> df1
   c1 c3 c2 c4 c5
r1 NA NA NA NA NA
r3 NA  4  2 NA NA
r2 NA  3  1 NA NA
r4 NA NA NA NA NA
r5 NA NA NA NA NA