对多个文本文件进行计算并从中生成数据框R

时间:2018-11-27 03:04:24

标签: r dataframe

我正在尝试根据对多个文本文件所做的计算来创建表。我认为这可能需要某种循环,但是我仍然坚持如何进行。我尝试了不同的循环,但似乎没有任何作用。我已经用一个文件完成了我想做的事情。这是我的工作代码:

flare <- read.table("C:/temp/HD3_Bld_CD8_TEM.txt", 
                header=T)

head(flare[,c(1,2)])

#sum of the freq column, check to see if close to 1
sum(flare$freq)

#Sum of top 10
ten <- sum(flare$freq[1:10])
#Sum of 11-100
to100 <- sum(flare$freq[11:100])
#Sum of 101-1000
to1000 <- sum(flare$freq[101:1000])
#sum of 1001+
rest <- sum(flare$freq[-c(1:1000)])

#place the values of the sum in a table
df <- data.frame(matrix(ncol = 1, nrow = 4))
x <- c("Sum")
colnames(df) <- x
y <- c("10", "11-100", "101-1000", "1000+")
row.names(df) <- y
df[,1] <- c(ten,to100,to1000,rest)

数据框最终看起来像这样:

>View(df)
         Sum
10       0.1745092
11-100   0.2926735
101-1000 0.4211533
1000+    0.1116640

这非常适合制作堆叠式barplot,而我确实做到了。但是,这仅适用于一个文本文件。我有几个相同的文件。它们都具有相同的列名,因此我知道它们都将使用DF $ freq列进行计算。对每个文件进行计算后如何制作表格?我想将文本文件的名称保留为样本名称,这样当我制作联合堆叠式小节时,所有名称都将存在。此外,在编写新表/数据框时确定数据方向的最佳方法是什么?

我对R还是陌生的,因此,任何帮助,任何解释都将受到欢迎。谢谢。

2 个答案:

答案 0 :(得分:1)

关于这样的事情,您的示例是不可复制的,因此我制作了一个可以调整的虚拟示例:

library(tidyverse)
###load ALL your dataframes
test_df_1 <- data.frame(var1 = matrix(c(1,2,3,4,5,6), nrow = 6, ncol = 1))
test_df_1
test_df_2 <- data.frame(var2 = matrix(c(7,8,9,10,11,12), nrow = 6, ncol = 1))
test_df_2
### Bind them into one big wide dataframe
df <- cbind(test_df_1, test_df_2)
### Add an id column which repeats (in your case adjust this to repeat for the grouping you want, i.e replace the each = 2 with each = 10, and each = 4 with each = 100)
df <- df %>% 
  mutate(id = paste0("id_", c(rep(1, each = 2), rep(2, each = 4))))
### Gather your dataframes into long format by the id
df_gathered <- df %>% 
  gather(value = value, key = key, - id)
df_gathered
### use group_by to group data by id and summarise to get the sum of each group
df_gathered_sum <- df_gathered %>% 
  group_by(id, key) %>% 
  summarise(sigma = sum(value))
df_gathered_sum

如果您的df长度不相等,则ID列可能会出现问题,因此这只是部分答案。简化数据集示例可以做得更好。其他人可以参与创建id列吗?可能已经对其进行了一些编辑整理了……

答案 1 :(得分:0)

我想我解决了!它为我提供了所需的数据框,并可以根据它创建堆叠的条形图以显示数据。

sumfunction <- function(x) {
wow <- read.table(x, header=T)
#Sum of top 10
ten <- sum(wow$freq[1:10])
#Sum of 11-100
to100 <- sum(wow$freq[11:100])
#Sum of 101-1000
to1000 <- sum(wow$freq[101:1000])
#sum of 1001+
rest <- sum(wow$freq[-c(1:1000)])
blah <- c(ten,to100,to1000,rest)
}

library(data.table)
library(tools)
dir = "C:/temp/"
filenames <- list.files(path = dir, pattern = "*.txt", full.names = FALSE)
alltogether <- lapply(filenames, function(x) sumfunction(x))
data <- as.data.frame(data.table::transpose(alltogether), 
                  col.names =c("Top 10 ", "From 11 to 100", "From 101 to 1000", "From 1000 on "),
                  row.names = file_path_sans_ext(basename(filenames)))

这给了我想要的数据框。我没有将“前10、11-100、101-1000、1000 +”作为行名,而是将它们更改为列名,而是使每个文本文件的名称成为行名。 file_path_sans_ext(basename(filenames))确保仅保留文件名并删除扩展名。

我希望这对阅读本文的人有所帮助!再次感谢你!我之所以喜欢这个平台,是因为成为这个环境的一部分可以让我思考,并始终致力于在R上超越自我。

如果任何人有任何意见,那就太好了!!! <3