【问题标题】:How to define a new dataframe column based on multiple conditions in R?如何根据 R 中的多个条件定义新的数据框列?
【发布时间】:2021-05-10 16:50:37
【问题描述】:

我在 R 的数据框中有一些原始数据要转换。基本上,我有一个包含大约 1000 个观察值和 4 个变量的长格式表,其中包含 ID(个人身份)、问题编号(总共 80 个以上)以及此图像dataframe 中看到的答案。以这种格式对每个人重复这些问题。

data <- data.frame(
    id = 1:10,
    Question = rep("Q1", 10),
    Answer = sample(5, 10, replace = TRUE)
)

我想仅基于选择的问题创建一个新列,并根据答案值为该列赋予不同的值。

例如,如果感兴趣的一行答案 = 5,我的新列的值应该是 20。这些值没有特定关系(数学上),但它们不是随机的(例如 1 ~ 0、2 ~ 1、5 〜20)。如果该行不感兴趣,则值为 NA(缺失)。

如果感兴趣的行是 2 和 5 时的预期输出,假设新列名是“new_values”并且只是为了举例,规则是 new_values &lt;- Answer * 4

   id Question Answer new_values
1   1       Q1      4         NA
2   2       Q1      3         12
3   3       Q1      5         NA
4   4       Q1      3         NA
5   5       Q1      3         12
6   6       Q1      3         NA
7   7       Q1      2         NA
8   8       Q1      5         NA
9   9       Q1      2         NA
10 10       Q1      2         NA

【问题讨论】:

  • 必须通过dput(head(data)) 发布可重现的数据集样本,以便更好地获得相关答案,并清楚地描述所需输出的外观。跨度>
  • 查看dplyr::mutatedplyr::recode 函数
  • 我会做这样的事情:library(dplyr) x &lt;-seq(1,20) y &lt;- seq(10,29) df &lt;- data.frame(x=x,y=y) df &lt;- df %&gt;% mutate(newColumn = ifelse(y &gt; 20, x + y, x * y)) head(df)
  • 我喜欢用查找表来做到这一点:lookup = data.frame(Answer = c(1, 2, 5), New_Column = c(0, 1, 20)),然后你可以进行合并或左连接,merge(old_data, lookup, by = "Answer")
  • @AbdurrahmanYavuz 如果您使用的是dplyr,这是使用单个case_when 而不是多个嵌套ifelse() 的最佳时机。

标签: r dataframe


【解决方案1】:

您可以通过定义您感兴趣的行然后为您的新列执行条件定义来实现这一点。定义您感兴趣的行取决于您使用的标准,这是另一回事。

为简单起见,假设您对第 2、3 和 5 行感兴趣。将其定义为:

rows_of_interest <- c(2, 3, 5)

首先,我们可以将所有新值定义为 NA,以便新列适合我们的数据框。

data <- data.frame(
    id = 1:10,
    Question = rep("Q1", 10),
    Answer = sample(5, 10, replace = TRUE)
)

data$new_values <- NA

然后,我们应用条件。您没有明确定义如何将 Answer 转换为 new_values,但假设这是一组简单的情况,您可能需要为此定义一个函数,只是为了清楚起见。

answer_to_new_values_converter <- function(answer) {
   if (answer < 2)
     return(answer + 5)
   if (answer > 3)
     return(answer * 4)
}

现在将其应用于列,但仅应用于我们感兴趣的行。我们可以通过简单的索引来做到这一点。

data$new_values[rows_of_interest] <- answer_to_new_values_converter(data$Answer[rows_of_interest])

就是这样。

【讨论】:

    猜你喜欢
    • 2020-01-26
    • 1970-01-01
    • 1970-01-01
    • 2018-11-25
    • 2020-07-09
    • 1970-01-01
    • 1970-01-01
    • 2021-08-06
    • 2023-01-04
    相关资源
    最近更新 更多