当前位置: 首页 > 知识库问答 >
问题:

dplyr使用条件值进行变异

怀宇
2023-03-14

在一个有四列的大数据框(“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中执行此操作?

共有3个答案

宿文栋
2023-03-14

它看起来像是从Mosaic包中派生的Factor就是为此而设计的。在这个例子中,它看起来像:

library(mosaic)
myfile <- mutate(myfile, V5 = derivedFactor(
    "1" = (V1==1 & V2!=4),
    "2" = (V2==4 & V3!=1),
    .method = "first",
    .default = 0
    ))

(如果希望结果是数字而不是因子,请将derivedFactor包装为.numeric

请注意,。与组合的默认选项。method=“first”设置“else”条件——此方法derivedFactor的帮助文件中介绍。

冉锋
2023-03-14
匿名用户

使用dplyr 0.7。2,您可以在功能时使用非常有用的case\u:

x=read.table(
 text="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")
x$V5 = case_when(x$V1==1 & x$V2!=4 ~ 1,
                 x$V2==4 & x$V3!=1 ~ 2,
                 TRUE ~ 0)

dplyr::mutate表示,它给出:

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

请注意,NA未被特别处理,因为这可能会产生误导。只有在不匹配任何条件时,该函数才会返回NA。如果你在一行中加上TRUE~,就像我在示例中所做的那样,返回值将永远不会是NA

因此,您必须通过添加类似于is的语句,明确地告诉case\u何时NA放在它所属的位置。na(x$V1)|是。na(x$V3)~na_整数。提示:dplyr::coalesce()函数有时在这里非常有用!

此外,请注意,NA单独使用通常不起作用,您必须输入特殊的NA值:NA\u整数NA\u字符NA\u实数

阚正真
2023-03-14

试试这个:

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\u when提供了另一种解决方案:

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

 类似资料:
  • 我有一个带有两个得分列的data.frame。我希望在每行的基础上有条件地使用其中一个的数据。我用下面的一个例子来解释... 在这种情况下,Final最终将与test_low相同,因为对于两个Mains(即,当单元格为'high'时,单元格为'low时),test_low列小于test_high列。

  • 我正在尝试使用创建一个新列,该列的值基于特定的列。 最后一个数据帧示例(我正在尝试创建): 这个问题基本上与此相反:dplyr-mutate:使用动态变量名。我不能使解决方案适应我的问题。

  • 我试图计算许多列的行平均值。有人能解释一下为什么下面的代码只计算代码中两个变量(var_1和var_13)的平均值,而不是所有13列的平均值吗?

  • 我有一个名称重复的数据集。如果名称重复,我想创建一个值为1(TRUE)或0(FALSE)的新列。 这是我使用的代码: 或者 然而,我得到了上面可以看到的错误。 另一个想法是使用group_by,然后计算计数。喜欢: 但是,它不能返回原始数据帧后group_by

  • 我已经更新了dplyr(现在是0.7.1),我的很多旧代码都不能用了,因为mutate_each已经被弃用了。我曾经用mutate_each做类似这样的事情(代码如下),使用列索引。我会在数百个专栏中这样做。而我就是搞不清楚如何用mutate_at正确使用vars参数。我看到的所有例子都使用了列名...我不想这么做。我确信这是一个简单的答案,但是我已经花了太多的时间试图弄明白它,并且将非常感谢一些

  • 我正在为一个大的数据集创建条件平均值,这个数据集包含了几年来一周内看到的流感病例数。数据是这样组织的: 我想做的是创建一个新的列,列出往年同一周的平均病例数。例如,对于Week所在的行。数字是1和流感。今年是2017年,我希望新行给出任何一年的平均计数。数字==1 但是,由于有四年的数据* 52周,因此需要大量迭代才能阐明条件。有没有办法在dplyr中优雅地编码它?我经常遇到的问题是,我想根据周.