如何从不同的txt文件中找到列的平均值?

时间:2017-10-28 01:03:52

标签: r loops import lapply

R的新人,我看过以前的帖子,但无法让它发挥作用。我需要每个表的V4(每个表中的变量/列)的平均值。理想情况下,我需要一张具有每张桌子V4平均值的决赛桌。这是我到目前为止的代码:

file_list <- list.files(path = folder, pattern = "*.txt") 

r <- llply(file_list, read.table, skip = 1)

一个文件夹中共有111个txt文件,我已经读取了除第一行以外的所有文件,因为它无法使用。谢谢!

2 个答案:

答案 0 :(得分:0)

您的lapply读取会创建一个数据框列表,每个文件读取一个。如果您只想获得每个V4的平均值,请尝试:

file_list <- list.files(path = folder, pattern = "*.txt") 

r <- lapply(file_list, FUN = function(x){
                                df = read.table(x, skip=1)
                                mean(df$V4)
                             })

在此lapply中,x是来自file_list的文件名。其内容被读入df(使用相同的选项),然后计算V4的平均值。您将获得一个与file_list长度相同的列表。如果您想要矢量,请将lapply更改为sapply

如果V4列有任何NA,如果你想在计算平均值时跳过NAs,你会得到相同的结果,为它添加选项na.rm = T

答案 1 :(得分:0)

只猜测数据的输出,但这对我有用:

library(tidyverse)

df_list %>% 
  mutate(var4_mean = map_dbl(data, ~mean(.$var4)))

返回:

# A tibble: 2 x 2
              data var4_mean
            <list>     <dbl>
1 <tibble [3 x 4]> 489.23667
2 <tibble [3 x 4]>  56.56667

如果你想要完整的所有var4的单一平均值,你可以这样做:

df_list %>% 
  unnest() %>% 
  summarise(var4_mean = mean(var4))

返回:

# A tibble: 1 x 1
  var4_mean
      <dbl>
1  272.9017

如果您想通过可重现的示例尝试此操作,请运行以下命令:

library(tidyverse)

df_1 <- tibble(
  var1 = c(1423, 3222, 2131),
  var2 = c(6.27, 26.4, 18.1),
  var3 = c(1461, 2112, 2531),
  var4 = c(614.2, 22.41, 831.1)
)

df_2 <- tibble(
  var1 = c(14, 22, 31),
  var2 = c(6.2, 2.4, 8.1),
  var3 = c(141, 212, 231),
  var4 = c(64.2, 22.4, 83.1)
)

df_1 <- nest(df_1)
df_2 <- nest(df_2)

df_list <- list(df_1, df_2)
df_list <- bind_rows(df_list)
df_list

# Unnest the data frames and compute mean of entire var4
df_list %>% 
  unnest() %>% 
  summarise(var4_mean = mean(var4))

# Compute mean of var4 for each individual data frame
df_list %>% 
  mutate(var4_mean = map_dbl(data, ~mean(.$var4)))

我建议从R4DS阅读本章。它是嵌套数据框的绝佳读物。