【问题标题】:add column based on condition on several columns根据几列上的条件添加列
【发布时间】:2021-05-06 18:52:38
【问题描述】:

我有一个大型调查数据集。现在我想添加一列,根据参与者对某些问题的回答对他们进行分类。

我有以下数据框: (实际上比这要宽得多,大约 120 列)

age item1 item2 item3 ... item9 question1 question2 ...
18      0     0     4 ...     0         1         2 ...
19      0     4     0 ...     0         5         6 ...
20      4     4     0 ...     4         1         2 ...
21      0     0     4 ...     0         3         4 ...

我有以下我想考虑分类的项目列表:(实际上比只有 3 个项目长得多)

selector <- c("item1", "item2", "item9")

现在我想选择符合条件“至少我的列表中的一项被评为高于 3”的每个参与者(行),并在行中添加一个标签。 我不能使用“starts_with”之类的东西,因为我不想要所有以“item”开头的项目,而只想要列表中的那些。

结果应如下所示:

age item1 item2 item3 ... item9 question1 question2 ... category
18      0     0     4 ...     0         1         2 ... FALSE
19      0     4     0 ...     0         5         6 ... TRUE
20      4     4     0 ...     4         1         2 ... TRUE
21      0     0     4 ...     0         3         4 ... FALSE

如何在不为我要考虑的每一列编写条件语句的情况下实现这一目标?

编辑:在这个问题的第一个版本中,有人告诉我this question 回答了我的问题,但事实并非如此。这是因为我明确不想命名条件中的所有列,而是从一个单独的地方(如列表)获取它们。上述问题中的答案仅在您想对数据集进行子集化并且没有要检查的大量条件列表时才有效。那我该怎么办?

【问题讨论】:

  • 类似:d[ rowSums(d[, selector] &gt; 3) &gt; 0, ]

标签: r


【解决方案1】:

您可以使用以下解决方案:

library(dplyr)
library(purrr)

df %>%
  mutate(category = pmap_lgl(df %>% 
                           select(selector), ~ any(c(...) > 3)))

  age item1 item2 item3 item9 question1 question2 category
1  18     0     0     4     0         1         2    FALSE
2  19     0     4     0     0         5         6     TRUE
3  20     4     4     0     4         1         2     TRUE
4  21     0     0     4     0         3         4    FALSE

数据

df <- read.table(header = TRUE, text = "
                 age item1 item2 item3 item9 question1 question2
18      0     0     4     0         1         2
19      0     4     0     0         5         6
20      4     4     0     4         1         2
21      0     0     4     0         3         4")

【讨论】:

    猜你喜欢
    • 2016-02-03
    • 1970-01-01
    • 1970-01-01
    • 2019-07-21
    • 2020-11-07
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多