为了演示目的,我使用了一个tidytuesday
名为的数据集animal_outcomes
。
我的问题:我在 a 中有几个数字列tibble
。我想要mutate
一个新列,它将所有列(最后一列除外)相加,如果总和等于最后一列,则新列为 1 ,否则为 0。我将进一步解释:
# Adding the example dataset
data <- tidytuesdayR::tt_load(x = "2020-07-21")
data <- data$animal_outcomes
现在数据是这样的:
> data$animal_outcomes
# A tibble: 664 × 12
year animal_type outcome ACT NSW NT QLD SA TAS VIC WA Total
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1999 Dogs Reclaimed 610 3140 205 1392 2329 516 7130 1 15323
2 1999 Dogs Rehomed 1245 7525 526 5489 1105 480 4908 137 21415
3 1999 Dogs Other 12 745 955 860 380 168 1001 6 4127
4 1999 Dogs Euthanized 360 9221 9 9214 1701 599 5217 18 26339
5 1999 Cats Reclaimed 111 201 22 206 157 31 884 0 1612
6 1999 Cats Rehomed 1442 3913 269 3901 1055 752 3768 62 15162
7 1999 Cats Other 0 447 0 386 46 124 1501 5 2509
8 1999 Cats Euthanized 1007 8205 847 10554 3415 1056 6113 5 31202
9 1999 Horses Reclaimed 0 0 1 0 2 1 87 0 91
10 1999 Horses Rehomed 1 12 3 3 10 0 19 0 48
# ℹ 654 more rows
# ℹ Use `print(n = ...)` to see more rows
我想添加一个列来检查该Total
列是否确实是所有列的总和。这是我脑海中的结果:
# A tibble: 664 × 13
year animal_type outcome ACT NSW NT QLD SA TAS VIC WA Total condition # notice this last column
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1999 Dogs Reclaimed 610 3140 205 1392 2329 516 7130 1 15323 1
2 1999 Dogs Rehomed 1245 7525 526 5489 1105 480 4908 137 21415 1
3 1999 Dogs Other 12 745 955 860 380 168 1001 6 4127 1
4 1999 Dogs Euthanized 360 9221 9 9214 1701 599 5217 18 26339 1
5 1999 Cats Reclaimed 111 201 22 206 157 31 884 0 1612 1
6 1999 Cats Rehomed 1442 3913 269 3901 1055 752 3768 62 15162 1
7 1999 Cats Other 0 447 0 386 46 124 1501 5 2509 1
8 1999 Cats Euthanized 1007 8205 847 10554 3415 1056 6113 5 31202 1
9 1999 Horses Reclaimed 0 0 1 0 2 1 87 0 91 1
10 1999 Horses Rehomed 1 12 3 3 10 0 19 0 48 1
# ℹ 654 more rows
# ℹ Use `print(n = ...)` to see more rows
我尝试了以下代码。它可以工作,但需要大量击键,因此,如果您有很多列,它将无法很好地工作:
> data$animal_outcomes %>%
mutate(condition = if_else((ACT + NSW + NT + QLD + SA + TAS + VIC + WA) == Total, 1, 0))
# A tibble: 664 × 13
year animal_type outcome ACT NSW NT QLD SA TAS VIC WA Total condition
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1999 Dogs Reclaimed 610 3140 205 1392 2329 516 7130 1 15323 1
2 1999 Dogs Rehomed 1245 7525 526 5489 1105 480 4908 137 21415 1
3 1999 Dogs Other 12 745 955 860 380 168 1001 6 4127 1
4 1999 Dogs Euthanized 360 9221 9 9214 1701 599 5217 18 26339 1
5 1999 Cats Reclaimed 111 201 22 206 157 31 884 0 1612 1
6 1999 Cats Rehomed 1442 3913 269 3901 1055 752 3768 62 15162 1
7 1999 Cats Other 0 447 0 386 46 124 1501 5 2509 1
8 1999 Cats Euthanized 1007 8205 847 10554 3415 1056 6113 5 31202 1
9 1999 Horses Reclaimed 0 0 1 0 2 1 87 0 91 1
10 1999 Horses Rehomed 1 12 3 3 10 0 19 0 48 1
# ℹ 654 more rows
# ℹ Use `print(n = ...)` to see more rows
我也使用了以下但它返回了错误:
data$animal_outcomes %>%
mutate(condition = if_else((ACT + NSW + NT + QLD + SA + TAS + VIC + WA) == Total, 1, 0))
另外,这个(显然是错误的,因为它对实际数字进行了总结4:11
):
data$animal_outcomes %>%
mutate(condition = if_else(sum(4:11) == Total, 1,0))
还有这个:我不确定为什么sum(ACT:WA)
不返回错误!如果没有返回错误,它实际上是在求和什么!!
data$animal_outcomes %>%
mutate(condition = if_else(sum(ACT:WA) == Total, 1,0))
# A tibble: 664 × 13
year animal_type outcome ACT NSW NT QLD SA TAS VIC WA Total condition
<dbl> <chr> <chr> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
1 1999 Dogs Reclaimed 610 3140 205 1392 2329 516 7130 1 15323 0
2 1999 Dogs Rehomed 1245 7525 526 5489 1105 480 4908 137 21415 0
3 1999 Dogs Other 12 745 955 860 380 168 1001 6 4127 0
4 1999 Dogs Euthanized 360 9221 9 9214 1701 599 5217 18 26339 0
5 1999 Cats Reclaimed 111 201 22 206 157 31 884 0 1612 0
6 1999 Cats Rehomed 1442 3913 269 3901 1055 752 3768 62 15162 0
7 1999 Cats Other 0 447 0 386 46 124 1501 5 2509 0
8 1999 Cats Euthanized 1007 8205 847 10554 3415 1056 6113 5 31202 0
9 1999 Horses Reclaimed 0 0 1 0 2 1 87 0 91 0
10 1999 Horses Rehomed 1 12 3 3 10 0 19 0 48 0
您可以尝试这个:
输出:
在您的最后一个例子中,如果您用 包装该列范围以
pick()
将其变成一个框架并用 替换sum()
,rowSums()
它就会起作用:这可能是示例数据选择不当,但这里的问题在于用 测试双精度数的相等性
==
。为了避免R Inferno 的第 1 圈 - 陷入浮点陷阱,您可能希望使用类似这样的方法:dplyr::near()
是一种更安全的选择,因为它在比较输入向量时使用内置容差,+
将布尔向量转换为数字(TRUE
到1
)结果:
示例数据:
bench::mark()
对于完整数据集 (664 × 12 tibble) 进行forrowSums()
和sum()
in 运算:rowwise()
创建于 2024-08-03,使用reprex v2.1.0
感谢大家提供的深刻解决方案。
我发现受先前答案启发的以下代码最适合我的问题: