【发布时间】: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 <- 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::mutate和dplyr::recode函数 -
我会做这样的事情:
library(dplyr) x <-seq(1,20) y <- seq(10,29) df <- data.frame(x=x,y=y) df <- df %>% mutate(newColumn = ifelse(y > 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()的最佳时机。