【问题标题】:Iterating (Looping) through columns of a dataframe in R通过 R 中数据框的列迭代(循环)
【发布时间】:2020-01-24 21:06:54
【问题描述】:

我在 R 中苦苦挣扎,希望有人可以帮助我。我正在尝试编写一个 for 循环来遍历数据框的列,但不幸的是,我没有成功。

所以这是我的问题: 我有 10 个数据帧(dt1、dt2、dt3、...、dt10)。例如,dt1 如下所示:

dt1<-data.frame(Topic1=c(1,2,3,4,5,6,7,8,9),Topic2=c(9,8,7,6,5,4,3,2,1), Topic3=c(1,9,2,8,3,7,4,6,5), Name=c("A","A","A","A","A","B","B","B","B"))

我想在过滤时检查 Name 变量是否仍然包含“A”和“B”,我将主题 1(然后是主题 2、主题 3……)过滤到大于 5。目前,我执行以下操作

Library(dpylr)

dt.new<-dt1 %>% filter(Topic1>5)
isTRUE("A" %in% dt.new$Name && "B" %in% dt.new$Name)

归根结底,对于每个数据框,我想要一个如下所示的新表(数据框):

result<-data.frame(Topic=c("Topic1","Topic2","Topic3"),Return=c("FALSE","FALSE","TRUE"))

现在的问题是,我有几个数据框(dt1、dt2……),每个数据框都有 50 多个变量(Topic1、……、Topic50)。

到目前为止,我已经编写了一些循环并进行了尝试。但遗憾的是没有成功。因此,我很乐意收到任何提示或提示。

非常感谢!

【问题讨论】:

    标签: r dataframe for-loop filter


    【解决方案1】:

    一个选项是按“名称”、summarise 对列名称以“主题”开头的变量进行分组,方法是检查是否存在大于 5 的 any 值,然后检查 gather(获取已弃用 - 在较新的 tidyr 中 - 使用 pivot_longer) 将“宽”转换为“长”,按“主题”列分组,summarise 通过检查 all 的“val”元素是否为真

    library(dplyr)
    library(tidyr)
    dt1 %>%
        group_by(Name) %>% 
        summarise_at(vars(starts_with('Topic')), ~ any(. > 5)) %>%
        gather(Topic, val, -Name) %>% 
        group_by(Topic) %>% 
        summarise(Return = all(val))
    # A tibble: 3 x 2
    #  Topic  Return
    #  <chr>  <lgl> 
    #1 Topic1 FALSE 
    #2 Topic2 FALSE 
    #3 Topic3 TRUE  
    

    或先将其重塑为“长”格式,然后执行summariseation

    dt1 %>% 
       pivot_longer(cols = -Name, names_to = "Topic") %>%
       filter(value > 5) %>% 
       group_by(Topic) %>% 
       summarise(result = n_distinct(Name) == 2)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      • 1970-01-01
      • 2019-05-17
      • 1970-01-01
      • 2013-01-14
      • 2023-02-23
      • 1970-01-01
      相关资源
      最近更新 更多