将 .xlsx 文件与 R 中的连续列名称连接起来
Concatenate .xlsx files with successive column names in R
假设我有这样的数据框:
df1 <- as.data.frame(rbind(c(182, 142, 120), c(640, 381, 192)))
colnames(df1) <- c("Q1", "Q2", "Q3")
df2 <- as.data.frame(rbind(c(73, 51, 67, 38), c(62, 42, 33, 46), c(84, 91, 77, 56)))
colnames(df2) <- c("Q4", "Q5", "Q6", "Q7")
df3 <- as.data.frame(t(c(1820, 2114)))
colnames(df3) <- c("Q8", "Q9")
df1
Q1 Q2 Q3
1 182 142 120
2 640 381 192
df2
Q4 Q5 Q6 Q7
1 73 51 67 38
2 62 42 33 46
3 84 91 77 56
df3
Q8 Q9
1 1820 2114
请注意,我有 3 个不同长度的数据帧。我想要实现的是将一个连接在另一个之上,并在这样做时指示其各自的列名。
期望的输出:
1 Q1 Q2 Q3
2 182 142 120
3 640 381 192
4 Q4 Q5 Q6 Q7
5 73 51 67 38
6 62 42 33 46
7 84 91 77 56
8 Q8 Q9
9 1820 2114
我一直试图通过将文件导出到 .xlsx 然后连接它们来做到这一点,但我只设法对它们进行排序
提前致谢
不确定您请求的格式在 R 中是否有意义,因为
data.frame 列的所有元素必须相同 class,因此一旦添加 header 行将被强制转换为字符作为行
data.frame 的所有行必须具有相同的长度,因此您需要用 NA 列 [=12= 的较少列修补 data.frames ]
但下面是一个解决方案,可以为您提供 data.frame 包含您在所需输出中显示的方式的数据:
df1 <- as.data.frame(rbind(c(182, 142, 120), c(640, 381, 192)))
colnames(df1) <- c("Q1", "Q2", "Q3")
df2 <- as.data.frame(rbind(c(73, 51, 67, 38), c(62, 42, 33, 46), c(84, 91, 77, 56)))
colnames(df2) <- c("Q4", "Q5", "Q6", "Q7")
df3 <- as.data.frame(t(c(1820, 2114)))
colnames(df3) <- c("Q8", "Q9")
maxCol <- max(ncol(df1), ncol(df2), ncol(df3))
match_df <- function(x, ncol){
delta <- ncol - dim(x)[2]
out <- {
if(delta > 0) unname(data.frame(append((rbind(colnames(x), unname(x))),
c(rep(NA, delta))))) else
unname(data.frame((rbind(colnames(x), unname(x)))))[, seq_len(ncol)]}
colnames(out) <- paste0("V", seq_len(ncol))
out
}
out <- unname(do.call(rbind, lapply(list(df1, df2, df3), match_df, ncol=maxCol)))
print(out, na.print = "")
#>
#> 1 Q1 Q2 Q3
#> 2 182 142 120
#> 3 640 381 192
#> 4 Q4 Q5 Q6 Q7
#> 5 73 51 67 38
#> 6 62 42 33 46
#> 7 84 91 77 56
#> 8 Q8 Q9
#> 9 1820 2114
R 中将数字数据保持为数字的一种更自然的方法是 "sort of cbind them",如您所说,并且,如果您愿意,可以融化并过滤它们以删除 NA 值:
library(data.table)
melt(rbindlist(list(df1, df2, df3), fill=TRUE), na.rm=TRUE)
#> variable value
#> 1: Q1 182
#> 2: Q1 640
#> 3: Q2 142
#> 4: Q2 381
#> 5: Q3 120
#> 6: Q3 192
#> 7: Q4 73
#> 8: Q4 62
#> 9: Q4 84
#> 10: Q5 51
#> 11: Q5 42
#> 12: Q5 91
#> 13: Q6 67
#> 14: Q6 33
#> 15: Q6 77
#> 16: Q7 38
#> 17: Q7 46
#> 18: Q7 56
#> 19: Q8 1820
#> 20: Q9 2114
不确定这种输出是否对您有任何帮助,但这里有一种方法可以做到这一点。
#Put the data in a list
list_df <- list(df1, df2, df3)
#Use lapply to iterate over list
output <- lapply(list_df, function(x) {
#shift by one row
x[2:(nrow(x) + 1), ] <- x
#Add column name as 1st row
x[1, ] <- names(x)
#Make new column names
names(x) <- paste0("col", seq_along(x))
#return the new dataframes
return(x)
}) %>% dplyr::bind_rows()
output
# col1 col2 col3 col4
#1 Q1 Q2 Q3 <NA>
#2 182 142 120 <NA>
#3 640 381 192 <NA>
#4 Q4 Q5 Q6 Q7
#5 73 51 67 38
#6 62 42 33 46
#7 84 91 77 56
#8 Q8 Q9 <NA> <NA>
#9 1820 2114 <NA> <NA>
假设我有这样的数据框:
df1 <- as.data.frame(rbind(c(182, 142, 120), c(640, 381, 192)))
colnames(df1) <- c("Q1", "Q2", "Q3")
df2 <- as.data.frame(rbind(c(73, 51, 67, 38), c(62, 42, 33, 46), c(84, 91, 77, 56)))
colnames(df2) <- c("Q4", "Q5", "Q6", "Q7")
df3 <- as.data.frame(t(c(1820, 2114)))
colnames(df3) <- c("Q8", "Q9")
df1
Q1 Q2 Q3
1 182 142 120
2 640 381 192
df2
Q4 Q5 Q6 Q7
1 73 51 67 38
2 62 42 33 46
3 84 91 77 56
df3
Q8 Q9
1 1820 2114
请注意,我有 3 个不同长度的数据帧。我想要实现的是将一个连接在另一个之上,并在这样做时指示其各自的列名。
期望的输出:
1 Q1 Q2 Q3
2 182 142 120
3 640 381 192
4 Q4 Q5 Q6 Q7
5 73 51 67 38
6 62 42 33 46
7 84 91 77 56
8 Q8 Q9
9 1820 2114
我一直试图通过将文件导出到 .xlsx 然后连接它们来做到这一点,但我只设法对它们进行排序
提前致谢
不确定您请求的格式在 R 中是否有意义,因为
data.frame 列的所有元素必须相同 class,因此一旦添加 header 行将被强制转换为字符作为行
data.frame 的所有行必须具有相同的长度,因此您需要用 NA 列 [=12= 的较少列修补 data.frames ]
但下面是一个解决方案,可以为您提供 data.frame 包含您在所需输出中显示的方式的数据:
df1 <- as.data.frame(rbind(c(182, 142, 120), c(640, 381, 192)))
colnames(df1) <- c("Q1", "Q2", "Q3")
df2 <- as.data.frame(rbind(c(73, 51, 67, 38), c(62, 42, 33, 46), c(84, 91, 77, 56)))
colnames(df2) <- c("Q4", "Q5", "Q6", "Q7")
df3 <- as.data.frame(t(c(1820, 2114)))
colnames(df3) <- c("Q8", "Q9")
maxCol <- max(ncol(df1), ncol(df2), ncol(df3))
match_df <- function(x, ncol){
delta <- ncol - dim(x)[2]
out <- {
if(delta > 0) unname(data.frame(append((rbind(colnames(x), unname(x))),
c(rep(NA, delta))))) else
unname(data.frame((rbind(colnames(x), unname(x)))))[, seq_len(ncol)]}
colnames(out) <- paste0("V", seq_len(ncol))
out
}
out <- unname(do.call(rbind, lapply(list(df1, df2, df3), match_df, ncol=maxCol)))
print(out, na.print = "")
#>
#> 1 Q1 Q2 Q3
#> 2 182 142 120
#> 3 640 381 192
#> 4 Q4 Q5 Q6 Q7
#> 5 73 51 67 38
#> 6 62 42 33 46
#> 7 84 91 77 56
#> 8 Q8 Q9
#> 9 1820 2114
R 中将数字数据保持为数字的一种更自然的方法是 "sort of cbind them",如您所说,并且,如果您愿意,可以融化并过滤它们以删除 NA 值:
library(data.table)
melt(rbindlist(list(df1, df2, df3), fill=TRUE), na.rm=TRUE)
#> variable value
#> 1: Q1 182
#> 2: Q1 640
#> 3: Q2 142
#> 4: Q2 381
#> 5: Q3 120
#> 6: Q3 192
#> 7: Q4 73
#> 8: Q4 62
#> 9: Q4 84
#> 10: Q5 51
#> 11: Q5 42
#> 12: Q5 91
#> 13: Q6 67
#> 14: Q6 33
#> 15: Q6 77
#> 16: Q7 38
#> 17: Q7 46
#> 18: Q7 56
#> 19: Q8 1820
#> 20: Q9 2114
不确定这种输出是否对您有任何帮助,但这里有一种方法可以做到这一点。
#Put the data in a list
list_df <- list(df1, df2, df3)
#Use lapply to iterate over list
output <- lapply(list_df, function(x) {
#shift by one row
x[2:(nrow(x) + 1), ] <- x
#Add column name as 1st row
x[1, ] <- names(x)
#Make new column names
names(x) <- paste0("col", seq_along(x))
#return the new dataframes
return(x)
}) %>% dplyr::bind_rows()
output
# col1 col2 col3 col4
#1 Q1 Q2 Q3 <NA>
#2 182 142 120 <NA>
#3 640 381 192 <NA>
#4 Q4 Q5 Q6 Q7
#5 73 51 67 38
#6 62 42 33 46
#7 84 91 77 56
#8 Q8 Q9 <NA> <NA>
#9 1820 2114 <NA> <NA>