将多个data.frames合并为一个(保留每个行名)
我输入了数据帧将多个data.frames合并为一个(保留每个行名),r,R,我输入了数据帧Berry和Orange Berry = structure(list(Name = c("ACT", "ACTION", "ACTIVISM", "ACTS", "ADDICTION", "ADVANCE"), freq = c(2L, 2L, 1L, 1L, 1L, 1L)), .Names = c("Name", "freq"), row.names = c(NA, 6L), class = "data.frame") Orange = structure(list(N
Berry
和Orange
Berry = structure(list(Name = c("ACT", "ACTION", "ACTIVISM", "ACTS",
"ADDICTION", "ADVANCE"), freq = c(2L, 2L, 1L, 1L, 1L, 1L)), .Names = c("Name",
"freq"), row.names = c(NA, 6L), class = "data.frame")
Orange = structure(list(Name = c("ACHIEVE", "ACROSS", "ACT", "ACTION",
"ADVANCE", "ADVANCING"), freq = c(1L, 3L, 1L, 1L, 1L, 1L)), .Names = c("Name",
"freq"), row.names = c(NA, 6L), class = "data.frame")
运行以下操作将获得所需的输出
output = t(merge(Berry,Orange, by = "Name", all = TRUE))
rownames(output) = c("","Berry","Orange")
colnames(output) = output[1,]
output = output[2:3,]
output = data.frame(output)
但是,现在我必须从72个数据帧创建输出,类似于Berry
和Orange
。由于merge
似乎一次只能处理两个data.frame
,因此我不确定什么是最适合我的方法。我尝试了rbind.fill
,它保留了值,但丢失了名称
。我找到了,但我自己无法找到解决方案
这里还有一个data.frame
,以提供一个可复制的示例
Apple = structure(list(Name = c("ABIDING", "ABLE", "ABROAD", "ACROSS",
"ACT", "ADVANTAGE"), freq = c(1L, 1L, 1L, 4L, 2L, 1L)), .Names = c("Name",
"freq"), row.names = c(NA, 6L), class = "data.frame")
我正在试图弄清楚如何从苹果、贝瑞和橙色中获得输出。我正在寻找一个解决方案,将工作多个数据帧,最好不用我手动提供数据帧
您可以假设要处理以获取输出的data.frame名称在列表df_names
中可用:
df_names = c("Apple","Berry","Orange")
或者,您也可以假设需要处理全局环境中的每个data.frame
,以创建输出
如果您的所有数据帧都在一个环境中,您可以将它们放入一个命名列表中,然后使用包整形2来整形列表。如果需要,可以将第一列设置为行名称
library(reshape2)
dcast(melt(Filter(is.data.frame, mget(ls()))), L1 ~ Name)
# L1 ABIDING ABLE ABROAD ACHIEVE ACROSS ACT ACTION ACTIVISM ACTS ADDICTION ADVANCE ADVANCING ADVANTAGE
# 1 Apple 1 1 1 NA 4 2 NA NA NA NA NA NA 1
# 2 Berry NA NA NA NA NA 2 2 1 1 1 1 NA NA
# 3 Orange NA NA NA 1 3 1 1 NA NA NA 1 1 NA
注意:这假设您的所有数据都在全局环境中,并且除了此处要使用的数据帧之外,不存在其他数据帧。我们可以使用tidyverse
library(dplyr)
library(tidyr)
list(Apple = Apple, Orange = Orange, Berry = Berry) %>%
bind_rows(.id = "objName") %>%
spread(Name, freq, fill = 0)
# objName ABIDING ABLE ABROAD ACHIEVE ACROSS ACT ACTION ACTIVISM ACTS ADDICTION ADVANCE ADVANCING ADVANTAGE
#1 Apple 1 1 1 0 4 2 0 0 0 0 0 0 1
#2 Berry 0 0 0 0 0 2 2 1 1 1 1 0 0
#3 Orange 0 0 0 1 3 1 1 0 0 0 1 1 0
由于您有72个data.frames,因此最好不要在全局环境中创建所有这些对象。而是读取列表中的数据集文件
,然后进行处理。假设,如果文件都在工作目录中
files <- list.files(pattern = ".csv")
lapply(files, read.csv, stringsAsFactors=FALSE)
文件您可以创建数据帧列表并使用lappy吗?