首页 > 解决方案 > 使用 lapply 计算多个数据帧中单列中的值

问题描述

我正在尝试计算数据框单列中特定值的出现百分比。我使用以下代码加载单个数据帧,并计算单列“计数器”中每个值的总计数。然后,我将它除以该数据框中存在的行数,以获得百分比。

test <- read.csv("./subdata/Bur01.csv")
test %>%
  group_by(Counter) %>%
  summarise(no_rows = length(Counter))

  Counter no_rows
    <int>   <int>
1       2     176
2       5      49
3       7     343


table(test$Counter)/length(test$Counter)


     2          5          7 
0.30985915 0.08626761 0.60387324 

但是,我有 187 个数据帧,它们都具有相同的结构(如列标题),但“计数器”列中有一组不同的值。我将它们全部加载到包含 187 个元素(名为 myfiles)的大列表中,如下所示:

temp <- list.files(path = "./subdata", pattern="*.csv", full.names=TRUE)
myfiles = lapply(temp, read.delim)

我是否能够编写一个函数或循环,只在每个单独的数据帧的“计数器”列中给出值的出现百分比,而不必分别进行每个操作?

谢谢!

标签: rlistdataframeloopslapply

解决方案


当然!

只需通过以下方式将您的函数应用于每个 data.frame lapply

props = lapply(myfiles, counter_props)

在哪里counter_props

counter_props = function (df) {
    prop.table(df$Counter)
}

…但是如果这是此逻辑的唯一用途,您当然不需要为此定义命名函数:

props = lapply(myfiles, function (df) prop.table(df$Counter))

您还可以通过拆分此计算的不同步骤(使用“purrr”包)在管道中编写整个内容:

props = myfiles %>%
    map(pull, Counter) %>%
    map(table) %>%
    map(prop.table)

(请注意,这prop.table实际上与将表格除以总长度相同。)


推荐阅读