根据来自不同数据帧的行名将列从另一个数据帧复制到
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 (如何根据来自另一个数据帧的值将值分配给数据帧中的新列)