我对R比较陌生,我想知道如何在使用rbind命令加入之前创建一个标识每个原始data.frames的变量(数字序列)。
由于在原始数据框中有一个变量是行ID号,如果创建一个循环,每次遇到行ID中的数字1时在新变量中分配一个新数字,它应该有效。 。
感谢。
答案 0 :(得分:6)
看起来bind_rows
包中的dplyr
也会这样做。使用maloneypatr的示例:
df1 <- data.frame(a = seq(1, 5, by = 1),
b = seq(21, 25, by = 1))
df2 <- data.frame(a = seq(6, 10, by = 1),
b = seq(26, 30, by = 1))
dplyr::bind_rows(df1, df2, .id = "source")
Source: local data frame [10 x 3]
# source a b
# (chr) (dbl) (dbl)
# 1 1 1 21
# 2 1 2 22
# 3 1 3 23
# 4 1 4 24
# 5 1 5 25
# 6 2 6 26
# 7 2 7 27
# 8 2 8 28
# 9 2 9 29
# 10 2 10 30
答案 1 :(得分:4)
gdata
包中的一个名为combine
的函数就是这样做的。
df1 <- data.frame(a = seq(1, 5, by = 1),
b = seq(21, 25, by = 1))
df2 <- data.frame(a = seq(6, 10, by = 1),
b = seq(26, 30, by = 1))
library(gdata)
combine(df1, df2)
a b source
1 1 21 df1
2 2 22 df1
3 3 23 df1
4 4 24 df1
5 5 25 df1
6 6 26 df2
7 7 27 df2
8 8 28 df2
9 9 29 df2
10 10 30 df2
答案 2 :(得分:2)
为什么不呢:
rbind( cbind(df1, origin="df1"),
cbind(df2, origin='df2') )
或者如果你想保留rownames:
rbind( cbind(df1, origin=paste("df1",rownames(df1), sep="_") ),
cbind(df2, origin=paste("df1",rownames(df1), sep="_") ) )
答案 3 :(得分:2)
您可以使用
transform(dat, newCol = cumsum(ID == 1))
其中dat
是数据框的名称,ID
是ID列的名称。
答案 4 :(得分:1)
一个相当可扩展的解决方案:
# test data:
df1 <- data.frame(id=letters[1:2])
df2 <- data.frame(id=letters[1:2])
将您的数据收集到一个列表中,然后立即rbind
:
dfs <- c("df1","df2")
do.call(rbind, Map("[<-", mget(dfs), TRUE, "source", dfs) )
# id source
#df1.1 a df1
#df1.2 b df1
#df2.1 a df2
#df2.2 b df2
另外,请注意,在此示例中,当rbind
使用命名列表时,您的rownames引用源数据。这意味着你几乎可以得到你想要的东西:
dfs <- c("df1","df2")
do.call(rbind, mget(dfs) )
# id
#df1.1 a
#df1.2 b
#df2.1 a
#df2.2 b
答案 5 :(得分:0)
谢谢大家! 我最终得到了一个简单的解决方案,通过创建索引与我的一个朋友合作,如下所示:
index<-rep(1,times=nrow(data.frame))
for (i in 1:(nrow(data.frame)-1)){
if (data_frame$ID [i+1]<= data.frame$ID[i]) {
index[i+1]<-index[i]+1
}
else {index[i+1]<-index[i]}}
new.data.frame <- cbind(index, data.frame)