【问题标题】:split data set based on multiple columns in R基于R中的多列拆分数据集
【发布时间】:2019-11-18 09:39:04
【问题描述】:

我有一个数据框和一个向量,如果值出现在向量中,我想将数据框拆分为多个列表。

例如,这里是向量:

foods_to_serve <- c("Sweets", "Bitter")

这是数据框:

library(tidyverse)
problem <- tibble(name = c("Angela", "Claire", "Justin", "Rachel"), 
                  favfood1 = c("Sweets", "Salty", "Sweets", "Salty"), 
                  favfood2 = c("Bitter", "Sweets", "Salty", NA), 
                  favfood3 = c("Salty", NA, NA, NA), 
                  hunger = c("high", "high", "low", "low"))

我希望 R 将其拆分为仅包含食物供应列表中出现的食物的列表。此外,人们可以在多个列表中,有些人可能会被完全排除在外。

更具体地说,我会得到一个如下所示的列表:

[1] 
Food_to_serve  name      hunger
Sweets        Angela     high
Sweets        Claire     high
Sweets        Justin     low

[2]
Food_to_serve  name      hunger
Bitter         Angela    high

我知道我可以使用 split(),但我不确定如何让它遍历这些不同的列。我认为我可能需要使用 purrr 中的 pmap 函数,但我不确定。如果某样东西是他们最喜欢的食物,我不介意最终列表是否保留,但我确实需要它将其余信息包含在原始数据框中。如果可能的话,一个整洁的解决方案将不胜感激。

我也尝试过使用 %in%,但我也不知道如何让它遍历多个列。

【问题讨论】:

标签: r list vector split purrr


【解决方案1】:

可能是这样的:

library(dplyr)
library(tidyr)
gather(problem,key = favfood,value = type,favfood1:favfood3,na.rm = TRUE) %>% 
  filter(type %in% foods_to_serve) %>% 
  group_split(type)

请注意,group_split 仍被标记为有些实验性,因此它的行为可能会在未来发生变化。

【讨论】:

  • filter(type %in% foods_to_serve) 为什么我们需要这条线?
  • @joran,谢谢你!一个问题,如果有时人们可以列出 3 种食物,而其他时候,他们可以列出 4 种或更多(favfood4 等)。有没有办法修改它来做类似 max(favfood) 的事情(我知道这不起作用)?
  • @J.Sabree 将 favfood1:favfood3 更改为 -c("name","hunger")
  • @M-M,问题是在我的数据集中,这些变量位于中间,但有时会添加或减去其他变量。我正在尝试找到一种方法使其能够抵抗用户错误。
  • 编辑:我刚刚发现您可以在收集中使用 contains()。取而代之的是 favfood1:favfood3,另一种选择是执行 contains("favfood") 以获得相同的效果。再次感谢@joran!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-06-27
  • 1970-01-01
  • 1970-01-01
  • 2021-04-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多