根据来自不同数据帧的行名将列从另一个数据帧复制到

Posted

技术标签:

【中文标题】根据来自不同数据帧的行名将列从另一个数据帧复制到【英文标题】:Copy column from another data frame to based on row names from a different data frame 【发布时间】:2015-03-10 14:09:32 【问题描述】:

我有几个数据框,两者中的一些行名是相同的。我想从第一个数据框中复制第二个数据框中存在的所有行名的列。第一个数据框 (df1) 看起来像

        m1      m2     m3
P001   60.00   2.0     1
P002   14.30   2.077   1
P003   29.60   2.077   1
P004   10.30   2.077   1
P006   79.30   2.077   1
P008    9.16   2.077   1

第二个数据框(df2)看起来像

        n1      n2   n3
P001   12.00   2.0   1
P003   17.60   1.7   1
P005   22.30   2.7   1
P006   26.30   1.7   1

我想为第二个数据框中存在的所有行名(即 P001、P003、P005 和 P006)设置变量 m1 (df1$m1)。如果 df1 中不存在某些行名(例如 P005),则可以将其替换为 NA 或 0。

答案可能是这样的

       m1           
P001   60.00
P003   29.60
P005   NA
P006   79.30 

更长的选择是使用循环,但我确信 R 应该有一个快捷方式。

【问题讨论】:

不要使用行名,而是使用专用列并搜索合并的 data.frames 和 data.tables,例如***.com/q/19553005/817778 【参考方案1】:

data.table 对象不保留行名(尽管它存储为属性),但您可以将行名转换为附加列,同时使用keep.rownames = TRUE 转换为data.table,然后在键入后,您可以使用二元连接加入数据集,同时通过引用更新df2(类似于@eddies 链接)

setDT(df1, keep.rownames = TRUE)
setkey(setDT(df2, keep.rownames = TRUE), rn)
df2[df1, m1 := i.m1][]
#      rn   n1  n2 n3   m1
# 1: P001 12.0 2.0  1 60.0
# 2: P003 17.6 1.7  1 29.6
# 3: P005 22.3 2.7  1   NA
# 4: P006 26.3 1.7  1 79.3

【讨论】:

【参考方案2】:

试试match():

df2$m1 <- df1$m1[match(row.names(df2), row.names(df1))]

【讨论】:

以上是关于根据来自不同数据帧的行名将列从另一个数据帧复制到的主要内容,如果未能解决你的问题,请参考以下文章

如何有效地计算数据帧的行数? [复制]

提高链接来自两个数据帧的数据的效率

熊猫,我怎样才能避免使用 iterrow (如何根据来自另一个数据帧的值将值分配给数据帧中的新列)

R:从一个数据帧中提取行,基于列名匹配来自另一个数据帧的值

如何向 pandas df 添加一个新列,该列从另一个数据帧返回同一组中更大的最小值

根据 pandas 中的字典对数据帧的行进行分组并对相应的分子求和