【发布时间】:2021-08-13 15:46:51
【问题描述】:
我有数据记录列名中的特征(在下面的示例中是动物)和单元格值中的频率。我想将这两个重新编码为更少的类别,以便将几个列分组为类别(在示例中它们是“狗”和“鸟”),并且频率被重新编码如下:
-
如果任何原始列包含“每日”或“每周”或“每月”→“定期”
-
else if ≥one column is "Rarely" → "Rarely"
-
else if ≥one column is "Never" → "Never"
事实证明,计算起来很棘手,因为它不是简单地对列值进行平均或取最大值。
到目前为止我已经尝试过什么
library(tidyverse)
data <- tibble::tribble(
~labrador, ~beagle, ~corgi, ~pigeon, ~sparrow, ~robin,
"Weekly", "Rarely", "Never", "Rarely", "Never", "Rarely",
"Never", "Never", "Monthly", "Never", "Never", "Never",
"Rarely", "Never", "Never", "Weekly", "Never", "Daily"
)
data %>%
mutate(dogs = case_when(
c(labrador, beagle, corgi) %in%
c("Daily", "Weekly", "Monthly") ~ "Regularly",
c(labrador, beagle, corgi) %in%
"Rarely" ~ "Rarely",
c(labrador, beagle, corgi) %in%
"Never" ~ "Never"
)) %>%
mutate(birds = case_when(
c(pigeon, sparrow, robin) %in%
c("Daily", "Weekly", "Monthly") ~ "Regularly",
c(pigeon, sparrow, robin) %in%
"Rarely" ~ "Rarely",
c(pigeon, sparrow, robin) %in%
"Never" ~ "Never"
))
#> Error: Problem with `mutate()` column `dogs`.
#> ℹ `dogs = case_when(...)`.
#> ℹ `dogs` must be size 3 or 1, not 9.
由reprex package (v2.0.0) 于 2021-08-13 创建
我猜这个错误意味着我对case_when() 做错了,因此它试图将 9 个值传递给dogs。目前我正在尝试检查任何输入列是否具有特定值(首先是“每日”、“每周”、“每月”),并分配所需的分组列值(“定期”)这三个频率,如果没有,请检查任何输入列是否为“很少”等。
我想要达到的目标
输入数据:
| labrador | beagle | corgi | pigeon | sparrow | robin |
|---|---|---|---|---|---|
| Weekly | Rarely | Never | Rarely | Never | Rarely |
| Never | Never | Monthly | Never | Never | Never |
| Rarely | Never | Never | Weekly | Never | Daily |
期望的输出df:
| labrador | beagle | corgi | pigeon | sparrow | robin | dogs | birds |
|---|---|---|---|---|---|---|---|
| Weekly | Rarely | Never | Rarely | Never | Rarely | Regularly | Rarely |
| Never | Never | Monthly | Never | Never | Never | Regularly | Never |
| Rarely | Never | Never | Weekly | Never | Daily | Rarely | Regularly |
我想保持行的完整性(真实数据的列包含示例中未包含的更多信息),因此频率统计不会真正有帮助。在真实数据中还有更多的列和组,但如果我可以通过示例解决它,我应该能够将其扩展到那个。
【问题讨论】:
-
@r2evans 在这种情况下,我希望
dogs是“定期”——如果从要点控制流程中不清楚,我实际上希望将最频繁的类别分配给组 -
(抱歉,重读,理解,修复,看我的回答。)
-
我认为
dplyr::if_any()在这里会很有用(如果您不想在给定答案中创建新功能)。在您的第一个“狗”逻辑中的使用示例:if_any(.cols = c(labrador, beagle, corgi), ~.x %in% c("Daily", "Weekly", "Monthly")) ~ "Regularly"