R 将两个数据帧一个接一个地组合在一起
我有两个数据帧,我想把一个放在另一个上面,列名称为“with”的第二个列作为新数据帧的一行。列名不同,一个数据帧有更多的列 例如: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
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”结合起来,但我还需要多个工作表。谢谢你的回答,非常有帮助。非常感谢,这正是我想要的!非常感谢,这正是我想要的!