【问题标题】:R: filter() in for loop running through columnsR:通过列运行的for循环中的filter()
【发布时间】:2018-10-11 17:51:59
【问题描述】:

在 R 中 - 尝试遍历列名列表,按特定条目过滤并计算该条目的出现次数。我正在尝试在 for 循环中的管道中运行类似下面的内容来执行此操作 - 但除非我用 questionNumbers[i] 替换直接列名,否则我无法让下面的内容工作。

df %>%
nrow(filter(questionNumbers[i] == Response[1])) %>%
....etc

有什么想法吗?我觉得有一种apply() 的方法可以做到这一点 - 想法?

【问题讨论】:

  • 您的直觉是正确的,apply 家族函数会起作用。 lapply(df, function(x) sum(x == df$Response[1])) 会告诉你每列中有多少元素等于 df$Response[1]
  • @RyanD - 谢谢 - 我的挂断尝试只针对特定列执行此操作......我如何增加 apply() 来做到这一点?
  • 您可以将df 替换为df[, c('column1', 'column2')],其中'column1''column2' 是您要检查的列的名称。所以lapply(df[, column_name_vector], function(x) sum(x == df$Response[1]))
  • 如果您添加一个可重现的示例,或者使用您自己的部分数据,或者向我们展示此计算在示例数据集上的样子,这可能会有所帮助

标签: r filter apply tidyverse


【解决方案1】:

所以假设你有一个data.frame(我将使用mtcars)和一个你正在寻找的结果向量(c(1,2))。以下lapply 的组合将适用于tibbletidyr 包。

responses = c(1,2)

#create a named list
exampleOutput <- lapply(setNames(names(mtcars),names(mtcars)), function(x){
  lapply(setNames(responses, paste0('response_', responses)),function(y){
    mtcars[mtcars[x] == y, x] %>%
      length
  }) %>% 
    #convert named list into a tibble/dataframe
    tibble::as.tibble()
}) %>%
  #convert list into a tibble/dataframe
  tibble::enframe() %>%
  #open up the nested data
  tidyr::unnest()

你会得到这样的东西

  name  response_1 response_2
   <chr>      <int>      <int>
 1 mpg            0          0
 2 cyl            0          0
 3 disp           0          0
 4 hp             0          0
 5 drat           0          0
 6 wt             0          0
 7 qsec           0          0
 8 vs            14          0
 9 am            13          0
10 gear           0          0
11 carb           7         10

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-10-22
    • 2019-10-29
    • 2021-12-01
    • 2015-12-25
    • 2011-01-31
    • 1970-01-01
    • 2016-11-14
    • 1970-01-01
    相关资源
    最近更新 更多