我在data.frame对象中有位置索引向量,但在每个data.frame对象中,位置索引向量的顺序非常不同。但是,我希望将这些data.frame对象对象集成/合并到一个具有非常特定顺序的常见data.frame中,并且不允许在其中进行复制。有没有人知道更容易做到这一点的诀窍?任何人都可以提出可行的方法来完成这项任务吗?
v1 <- data.frame(
foo=c(1,2,3),
bar=c(1,2,2),
bleh=c(1,3,0))
v2 <- data.frame(
bar=c(1,2,3),
foo=c(1,2,0),
bleh=c(3,3,4))
v3 <- data.frame(
bleh=c(1,2,3,4),
foo=c(1,1,2,0),
bar=c(0,1,2,3))
积分后的initial_output <- data.frame(
foo=c(1,2,3,1,2,0,1,1,2,0),
bar=c(1,2,2,1,2,3,0,1,2,3),
bleh=c(1,3,0,3,3,4,1,2,3,4)
)
rmDuplicate_output <- data.frame(
foo=c(1,2,3,1,0,1,1),
bar=c(1,2,2,1,3,0,1),
bleh=c(1,3,0,3,4,1,2)
)
final_output <- data.frame(
foo=c(1,1,1,1,2,3,0),
bar=c(0,1,1,1,2,2,3),
bleh=c(1,1,2,3,3,0,4)
)
如何轻松获得最终所需的输出?有没有有效的方法对data.frame对象进行这种操作?感谢
答案 0 :(得分:4)
您还可以使用mget
/ ls
组合使用以编程方式获取数据框(无需键入单个名称),然后使用data.table
s rbindlist
和{ {1}}提高效率的功能/方法(请参阅here和here)
unique
作为旁注,通常最好将多个library(data.table)
unique(rbindlist(mget(ls(pattern = "v\\d+")), use.names = TRUE))
# foo bar bleh
# 1: 1 1 1
# 2: 2 2 3
# 3: 3 2 0
# 4: 1 1 3
# 5: 0 3 4
# 6: 1 0 1
# 7: 1 1 2
保存在一个列表中,以便您可以更好地控制它们
答案 1 :(得分:3)
这是一个解决方案:
# combine dataframes
df = rbind(v1, v2, v3)
# remove duplicated
df = df[! duplicated(df),]
# sort by 'bar' column
df[order(df$bar),]
foo bar bleh
7 1 0 1
1 1 1 1
4 1 1 3
8 1 1 2
2 2 2 3
3 3 2 0
6 0 3 4
答案 2 :(得分:3)
我们可以使用bind_rows
中的dplyr
,使用distinct
和arrange
删除重复项&#39; bar&#39;
library(dplyr)
bind_rows(v1, v2, v3) %>%
distinct %>%
arrange(bar)
# foo bar bleh
#1 1 0 1
#2 1 1 1
#3 1 1 3
#4 1 1 2
#5 2 2 3
#6 3 2 0
#7 0 3 4