r - dplyr 使用条件值进行变异

标签 r dplyr

在具有四列的大型数据框(“myfile”)中,我必须添加第五列,其中的值有条件地基于前四列。

更喜欢使用 dplyrmutate 的答案,主要是因为它在大型数据集中的速度。

我的数据框如下所示:

  V1 V2 V3 V4
1  1  2  3  5
2  2  4  4  1
3  1  4  1  1
4  4  5  1  3
5  5  5  5  4
...

第五列(V5)的值基于一些条件规则:

if (V1==1 & V2!=4) {
  V5 <- 1
} else if (V2==4 & V3!=1) {
  V5 <- 2
} else {
  V5 <- 0
}

现在我想使用 mutate 函数在所有行上使用这些规则(以避免缓慢循环)。像这样的东西(是的,我知道这样不行!):

myfile <- mutate(myfile, if (V1==1 & V2!=4){V5 = 1}
    else if (V2==4 & V3!=1){V5 = 2}
    else {V5 = 0})

这应该是结果:

  V1 V2 V3 V4 V5
1  1  2  3  5  1
2  2  4  4  1  2
3  1  4  1  1  0
4  4  5  1  3  0
5  5  5  5  4  0

如何在 dplyr 中执行此操作?

最佳答案

试试这个:

myfile %>% mutate(V5 = (V1 == 1 & V2 != 4) + 2 * (V2 == 4 & V3 != 1))

给予:

  V1 V2 V3 V4 V5
1  1  2  3  5  1
2  2  4  4  1  2
3  1  4  1  1  0
4  4  5  1  3  0
5  5  5  5  4  0

或者这个:

myfile %>% mutate(V5 = ifelse(V1 == 1 & V2 != 4, 1, ifelse(V2 == 4 & V3 != 1, 2, 0)))

给予:

  V1 V2 V3 V4 V5
1  1  2  3  5  1
2  2  4  4  1  2
3  1  4  1  1  0
4  4  5  1  3  0
5  5  5  5  4  0

注意

建议您为数据框取一个更好的名称。 myfile 让它看起来好像包含一个文件名。

上面使用了这个输入:

myfile <- 
structure(list(V1 = c(1L, 2L, 1L, 4L, 5L), V2 = c(2L, 4L, 4L, 
5L, 5L), V3 = c(3L, 4L, 1L, 1L, 5L), V4 = c(5L, 1L, 1L, 3L, 4L
)), .Names = c("V1", "V2", "V3", "V4"), class = "data.frame", row.names = c("1", 
"2", "3", "4", "5"))

更新 1 由于最初发布的 dplyr 已将 %.% 更改为 %>%,因此相应地修改了答案。

更新 2 dplyr 现在有 case_when,它提供了另一种解决方案:

myfile %>% 
       mutate(V5 = case_when(V1 == 1 & V2 != 4 ~ 1, 
                             V2 == 4 & V3 != 1 ~ 2,
                             TRUE ~ 0))

关于r - dplyr 使用条件值进行变异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22337394/

相关文章:

r,根据以下记录的值更新时间戳

r - 如何在 RStudio Markdown 中编译 pdf?

r - 使用纬度/经度坐标创建六边形单元格

r - 如何在R中将一列的元素与group_by相交

r - 批量预测;使用 apply() 函数而不是 for 循环。 apply() 函数给出不同点的预测

r - 列表删除给定列中具有 NA 的行

r - dplyr - 多个变量的汇总表

r - 用 `dplyr`保存残差

r - 在数据框内扩展数据框

r - 根据来自不同列的值的总和过滤行组