在一个有四列的大数据框(“myfile”)中,我必须添加第五列,其中的值有条件地基于前四列。
更喜欢使用dplyr
和mutate
的答案,主要是因为它在大型数据集中的速度。
我的数据框如下所示:
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中执行此操作?
它看起来像是从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
的帮助文件中介绍。
匿名用户
使用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实数
。
试试这个:
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中优雅地编码它?我经常遇到的问题是,我想根据周.