【发布时间】:2014-02-07 14:19:15
【问题描述】:
我对使用 match 函数得到的输出有疑问。我有两个数据框,它们的行数和行名不同。我希望从前两个中获得两个新的数据帧,其中行/行名的数量相同。一种方法是将一个数据帧的行名与另一个数据帧匹配
到目前为止,这是我的代码:
x_1 <- c("A1", "A1", "B10", "B10", "B10", "B10", "C100", "C100", "C100", "C100")
y_1 <- round(seq(1, 24, length = 10), 2)
A <- data.frame(x_1, y_1)
x_2 <- c("A1", "B10", "C100", "D1", "D200", "G210")
y_2 <- round(seq(1, 24, length = 6), 2)
B <- data.frame( x_2, y_2 )
现在,由于 A 和 B 的行名不同,我希望制作 A 和 B 的新版本,但删除所有不同的行名。
m_1 <- names(table(A$x_1))
m_2 <- names(table(B$x_2))
comb_names <- union(m_1[!(m_1 %in% m_2)], m_2[!(m_2 %in% m_1)])
A_1 <- A[!A$x_1 %in% c(comb_names), ]
B_1 <- B[!B$x_2 %in% c(comb_names), ]
newB_1 <- B_1[match(A_1$x_1, B_1$x_2), ]
newB_1 是 B_1 的数据框,已与 A_1 中的行名匹配
我的问题是,当我输入代码 names(table(newB_1$x_2)) 时,我仍然得到 B_1 中的所有原始行名,这些原始行名本应使用此代码 B_1 <- B[!B$x_2 %in% c(comb_names), ] 删除。但是,当我输入 newB_1 时,它会给出正确的输出。
names(table(newB_1$x_2))
"A1" "B10" "C100" "D1" "D200" "G210"
newB_1
x_2 y_2
A1 1.0
A1 1.0
B10 5.6
B10 5.6
B10 5.6
B10 5.6
C100 10.2
C100 10.2
C100 10.2
C100 10.2
事实上,names(table(B_1$x_2)) 也是如此,这表明 B_1 <- B[!B$x_2 %in% c(comb_names), ] 不会删除上面给出的 comb_names 中包含的名称。
table(B_1$x_2)
A1 B10 C100 D1 D200 G210
1 1 1 0 0 0
最后的问题是如何完全删除数据框 A 和 B 不通用的行名,从而得到两个具有相同行名的数据框?即我不希望名称 D1、D200 和 G210 出现在新数据框中。
我希望以上内容有意义,但我很乐意澄清任何含糊之处。我想知道如何修改我的代码以获得所需的输出,但也欢迎其他可以复制结果的替代代码。
【问题讨论】:
-
尝试使用
as.character将行名从一个因子更改为一个字符。即使您放弃一些因子水平,也会保留。 -
我认为你在这里完成了复杂的任务或者我误解了你想要做什么。
merge(A,B,by=1)(A,B 没有设置名称的原始)是您要找的吗? -
@agstudy,太棒了!它似乎已经解决了这个问题。我不知道为什么我花了这么长时间才遇到合并功能。
-
@tcash,感谢您的建议。我尝试将因素转换为字符,但问题似乎仍然存在。