Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
创建一个变量,用于标识R中rbind命令后的原始data.frame_R_Loops_Rbind - Fatal编程技术网

创建一个变量,用于标识R中rbind命令后的原始data.frame

创建一个变量,用于标识R中rbind命令后的原始data.frame,r,loops,rbind,R,Loops,Rbind,我对R比较陌生,我想知道如何创建一个变量(数字序列),在与rbind命令连接之前,识别每个原始data.frames 因为在原始数据帧中有一个变量是行ID号,如果创建一个循环,每次遇到行ID中的数字1时在新变量中分配一个新的编号,那么它应该可以工作 谢谢 为什么不: rbind( cbind(df1, origin="df1"), cbind(df2, origin='df2') ) 或者,如果要保留行名称: rbind( cbind(df1, origin

我对R比较陌生,我想知道如何创建一个变量(数字序列),在与rbind命令连接之前,识别每个原始data.frames

因为在原始数据帧中有一个变量是行ID号,如果创建一个循环,每次遇到行ID中的数字1时在新变量中分配一个新的编号,那么它应该可以工作

谢谢

为什么不:

    rbind( cbind(df1, origin="df1"),
           cbind(df2,  origin='df2') )
或者,如果要保留行名称:

  rbind( cbind(df1, origin=paste("df1",rownames(df1), sep="_") ),
         cbind(df2, origin=paste("df1",rownames(df1), sep="_") ) )
你可以用

transform(dat, newCol = cumsum(ID == 1))

其中,
dat
是数据帧的名称,
ID
是ID列的名称。

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

df1一个相当可扩展的解决方案:

# test data:
df1 <- data.frame(id=letters[1:2])
df2 <- data.frame(id=letters[1:2])
另外,请注意,在本例中,当您使用命名列表
rbind
时,您的行名引用源数据。这意味着您几乎可以通过以下方式获得所需:

dfs <- c("df1","df2")
do.call(rbind, mget(dfs) )

#      id
#df1.1  a
#df1.2  b
#df2.1  a
#df2.2  b
dfs谢谢大家!
我与我的一位朋友通过创建一个索引得到了一个简单的解决方案,如下所示:

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)

index看起来
dplyr
包中的
bind\u行也会这样做。使用的示例:

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

df1是否有办法将源代码作为第一列而不是最后一列获取您可以添加一个管道<代码>%>%选择(`source`,everythings())
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