【发布时间】:2018-06-18 17:29:01
【问题描述】:
我有这样的数据:
cols <- c("X01_01","X01_01_p", "X01_02","X01_02_p", "X01_03","X01_03_p", "X01_04", "X01_05","X01_06")
set.seed(111)
values <- replicate(9, sample(1:5, 4, replace = TRUE))
df <- as.data.frame(values)
所以我的 df 看起来像这样:
X01_01 X01_01_p X01_02 X01_02_p X01_03 X01_03_p X01_04 X01_05 X01_06
1 3 2 3 1 1 3 5 4 3
2 4 3 1 1 5 2 2 3 3
3 2 1 3 1 2 2 4 1 2
4 3 3 3 3 4 2 2 3 4
我有一些列用于突变(不是全部)和新列的名称。
cols_to_mutate <- c("X01_01_p","X01_02_p", "X01_03_p", "X01_04", "X01_05","X01_06")
new_cols <- c("X01_01_n","X01_02_n", "X01_03_n", "X01_04_n", "X01_05_n","X01_06_n")
每个突变都是一样的:
- 如果值为 1 或 2,则新值必须为 0
- 如果值为 3,则新值必须为 0.5
- 如果值为 4 或 5,则新值必须为 1
我的 df 最终看起来像这样:
X01_01 X01_01_p X01_02 X01_02_p X01_03 X01_03_p X01_04 X01_05 X01_06 X01_01_n X01_02_n X01_03_n X01_04_n X01_05_n X01_06_n
1 3 2 3 1 1 3 5 4 3 0.0 0.0 0.5 1 1.0 0.5
2 4 3 1 1 5 2 2 3 3 0.5 0.0 0.0 0 0.5 0.5
3 2 1 3 1 2 2 4 1 2 0.0 0.0 0.0 1 0.0 0.0
4 3 3 3 3 4 2 2 3 4 0.5 0.5 0.0 0 0.5 1.0
在“硬编码”中,我可以写很多这样的行:
df <- mutate(df, X01_01_n = ifelse(X01_01_p <= 2, 0, (ifelse(X01_01_p == 3, 0.5, 1))))
df <- mutate(df, X01_02_n = ifelse(X01_02_p <= 2, 0, (ifelse(X01_02_p == 3, 0.5, 1))))
当然,我正在寻找一种更花哨和更快的方法来做到这一点,但是我搜索了又搜索,但没有找到解决方案。我试过了:
df <- cbind(df,apply(df[,cols_to_mutate],2, function(x) if (x < 3) { 0} else if (x > 3) {1} else {.5}))
但这不起作用。任何想法都会很棒!
【问题讨论】:
标签: r if-statement dplyr