R 将两个数据帧一个接一个地组合在一起

R 将两个数据帧一个接一个地组合在一起,r,dataframe,R,Dataframe,我有两个数据帧,我想把一个放在另一个上面,列名称为“with”的第二个列作为新数据帧的一行。列名不同,一个数据帧有更多的列 例如: mydf1 <- data.frame(V1=c(1:5), V2=c(21:25)) mydf1 V1 V2 1 1 21 2 2 22 3 3 23 4 4 24 5 5 25 mydf2 <- data.frame(C1=c(1:10), C2=c(21:30),C3=c(41:50)) mydf2 C1 C2 C3 1 1

我有两个数据帧,我想把一个放在另一个上面,列名称为“with”的第二个列作为新数据帧的一行。列名不同,一个数据帧有更多的列

例如:

mydf1 <- data.frame(V1=c(1:5), V2=c(21:25))

mydf1
  V1 V2
1  1 21
2  2 22
3  3 23
4  4 24
5  5 25

mydf2 <- data.frame(C1=c(1:10), C2=c(21:30),C3=c(41:50))

mydf2
C1 C2 C3
1   1 21 41
2   2 22 42
3   3 23 43
4   4 24 44
5   5 25 45
6   6 26 46
7   7 27 47
8   8 28 48
9   9 29 49
10 10 30 50
> mydf1 <- data.frame(V1=c(1:5), V2=c(21:25))
> mydf1[,3] <- NA
> names(mydf1) <- c("V1", "V2", "NA")
> mydf2 <- data.frame(C1=c(1:10), C2=c(21:30),C3=c(41:50))
> names <- t(as.data.frame(names(mydf2)))
> names <- as.data.frame(names)
> names(mydf2) <- c("V1", "V2", "NA")
> names(names) <- c("V1", "V2", "NA")
> mydf3 <- rbind(mydf1, names)
> mydf4 <- rbind(mydf3, mydf2)
> row.names(mydf4) <- NULL
> mydf4
V1 V2   NA
1   1 21 <NA>
2   2 22 <NA>
3   3 23 <NA>
4   4 24 <NA>
5   5 25 <NA>
6  C1 C2   C3
7   1 21   41
8   2 22   42
9   3 23   43
10  4 24   44
11  5 25   45
12  6 26   46
13  7 27   47
14  8 28   48
15  9 29   49
16 10 30   50
我不在乎是否所有的数值都像字符一样处理。
非常感谢

您无需任何软件包即可轻松完成:

mydf1 <- data.frame(V1=c(1:5), V2=c(21:25))
mydf1[,3] <- NA
names(mydf1) <- c("one", "two", "three")
mydf2 <- data.frame(C1=c(1:10), C2=c(21:30),C3=c(41:50))
names <- t(as.data.frame(names(mydf2)))
names <- as.data.frame(names)
names(mydf2) <- c("one", "two", "three")
names(names) <- c("one", "two", "three")
mydf3 <- rbind(mydf1, names)
mydf4 <- rbind(mydf3, mydf2)

> mydf4
one two three
1    1  21  <NA>
2    2  22  <NA>
3    3  23  <NA>
4    4  24  <NA>
5    5  25  <NA>
6   C1  C2    C3
7    1  21    41
8    2  22    42
9    3  23    43
10   4  24    44
11   5  25    45
12   6  26    46
13   7  27    47
14   8  28    48
15   9  29    49
16  10  30    50
>     

mydf1您无需任何软件包即可轻松完成此操作:

mydf1 <- data.frame(V1=c(1:5), V2=c(21:25))
mydf1[,3] <- NA
names(mydf1) <- c("one", "two", "three")
mydf2 <- data.frame(C1=c(1:10), C2=c(21:30),C3=c(41:50))
names <- t(as.data.frame(names(mydf2)))
names <- as.data.frame(names)
names(mydf2) <- c("one", "two", "three")
names(names) <- c("one", "two", "three")
mydf3 <- rbind(mydf1, names)
mydf4 <- rbind(mydf3, mydf2)

> mydf4
one two three
1    1  21  <NA>
2    2  22  <NA>
3    3  23  <NA>
4    4  24  <NA>
5    5  25  <NA>
6   C1  C2    C3
7    1  21    41
8    2  22    42
9    3  23    43
10   4  24    44
11   5  25    45
12   6  26    46
13   7  27    47
14   8  28    48
15   9  29    49
16  10  30    50
>     

mydf1这里有一种使用
rbind.fill
函数的方法(属于
plyr
包)

库(plyr)
集合名称(rbind.fill(集合名称(mydf1,名称(mydf2[seq(mydf1)])),
rbind(名称(mydf2),mydf2),名称(mydf1))
V1 V2 NA
1   1 21 
2   2 22 
3   3 23 
4   4 24 
5   5 25 
6 C1 C2 C3
7   1 21   41
8   2 22   42
9   3 23   43
10  4 24   44
11  5 25   45
12  6 26   46
13  7 27   47
14  8 28   48
15  9 29   49
16 10 30   50

这里有一种使用
rbind.fill
功能的方法(属于
plyr
包的一部分)

库(plyr)
集合名称(rbind.fill(集合名称(mydf1,名称(mydf2[seq(mydf1)])),
rbind(名称(mydf2),mydf2),名称(mydf1))
V1 V2 NA
1   1 21 
2   2 22 
3   3 23 
4   4 24 
5   5 25 
6 C1 C2 C3
7   1 21   41
8   2 22   42
9   3 23   43
10  4 24   44
11  5 25   45
12  6 26   46
13  7 27   47
14  8 28   48
15  9 29   49
16 10 30   50
试试看

将第二个数据集中的列名指定给向量,然后用第一个数据集中的名称替换第二个数据集的名称。然后创建一个列表,其中中间的元素是您指定的向量。现在,当您调用
rbind
时,应该可以了,因为一切都按正确的顺序进行

d1$V3 <- NA
nm <- names(d2)
names(d2) <- names(d1)
dc <- do.call(rbind, list(d1,nm,d2))
rownames(dc) <- NULL
dc
d1$V3试试看

将第二个数据集中的列名指定给向量,然后用第一个数据集中的名称替换第二个数据集的名称。然后创建一个列表,其中中间的元素是您指定的向量。现在,当您调用
rbind
时,应该可以了,因为一切都按正确的顺序进行

d1$V3 <- NA
nm <- names(d2)
names(d2) <- names(d1)
dc <- do.call(rbind, list(d1,nm,d2))
rownames(dc) <- NULL
dc

d1$V3我不知道你用
write.table
尝试了什么,但在我看来,这似乎是一种方法

我会创建一个类似这样的函数:

myFun <- function(...) {
  L <- list(...)
  temp <- tempfile()
  maxCol <- max(vapply(L, ncol, 1L))
  lapply(L, function(x) 
    suppressWarnings(
      write.table(x, file = temp, row.names = FALSE,
                sep = ",", append = TRUE)))
  read.csv(temp, header = FALSE, fill = TRUE,
           col.names = paste0("New_", sequence(maxCol)),
           stringsAsFactors = FALSE)
}
编写该函数时,您可以指定两个以上的
data.frame
s作为输入:

mydf3 <- data.frame(matrix(1:8, ncol = 4))
myFun(mydf1, mydf2, mydf3)
#    New_1 New_2 New_3 New_4
# 1     V1    V2            
# 2      1    21            
# 3      2    22            
# 4      3    23            
# 5      4    24            
# 6      5    25            
# 7     C1    C2    C3      
# 8      1    21    41      
# 9      2    22    42      
# 10     3    23    43      
# 11     4    24    44      
# 12     5    25    45      
# 13     6    26    46      
# 14     7    27    47      
# 15     8    28    48      
# 16     9    29    49      
# 17    10    30    50      
# 18    X1    X2    X3    X4
# 19     1     3     5     7
# 20     2     4     6     8

mydf3我不知道你用
write.table
尝试了什么,但在我看来,这是一个不错的选择

我会创建一个类似这样的函数:

myFun <- function(...) {
  L <- list(...)
  temp <- tempfile()
  maxCol <- max(vapply(L, ncol, 1L))
  lapply(L, function(x) 
    suppressWarnings(
      write.table(x, file = temp, row.names = FALSE,
                sep = ",", append = TRUE)))
  read.csv(temp, header = FALSE, fill = TRUE,
           col.names = paste0("New_", sequence(maxCol)),
           stringsAsFactors = FALSE)
}
编写该函数时,您可以指定两个以上的
data.frame
s作为输入:

mydf3 <- data.frame(matrix(1:8, ncol = 4))
myFun(mydf1, mydf2, mydf3)
#    New_1 New_2 New_3 New_4
# 1     V1    V2            
# 2      1    21            
# 3      2    22            
# 4      3    23            
# 5      4    24            
# 6      5    25            
# 7     C1    C2    C3      
# 8      1    21    41      
# 9      2    22    42      
# 10     3    23    43      
# 11     4    24    44      
# 12     5    25    45      
# 13     6    26    46      
# 14     7    27    47      
# 15     8    28    48      
# 16     9    29    49      
# 17    10    30    50      
# 18    X1    X2    X3    X4
# 19     1     3     5     7
# 20     2     4     6     8

mydf3之所以这样做,是因为我想通过RDCOMClient包将xls中的一个大数据帧(tha包含多个数据帧)和许多大数据帧导出到多个工作表。我只设法将dataframes与write.table和“append=T”结合起来,但我还需要多个工作表。谢谢你的回答。我这样做是因为我想通过RDCOMClient包将xls中的一个大数据帧(tha包含多个数据帧)和许多大数据帧导出到多个工作表。我只设法将dataframes与write.table和“append=T”结合起来,但我还需要多个工作表。谢谢你的回答,非常有帮助。非常感谢,这正是我想要的!非常感谢,这正是我想要的!