【发布时间】:2023-02-23 21:20:47
【问题描述】:
我有这样一个数据框:
dat <- data.frame(var1 = rnorm(10), var2 = rnorm(10), var3 = rnorm(10), var4 = rnorm(10))
> dat
var1 var2 var3 var4
1 -1.3784414 1.06816022 1.46578217 -0.4141153
2 -0.3272332 -0.69470574 0.02220395 -0.5502878
3 0.2559891 -0.06964848 -0.34745180 0.6399705
4 0.6029044 1.23680560 -0.72392358 -0.1990832
5 1.3097174 -0.58028595 -0.01487186 -0.8765290
6 -1.2356668 0.41330063 -1.00375989 -1.1974204
7 -0.4126320 3.83320678 -1.42059022 -0.6747575
8 1.7339653 0.58610348 0.40200428 1.4582103
9 1.2994859 1.65355306 0.75985071 0.6455882
10 -0.2353356 2.04468739 -0.11521602 0.3251901
目的是创建一个新列,其名称包含列 var2、var3 和 var4 中每行中的最大值。
使用以下命令不会产生正确的输出:
library(dplyr)
dat %>%
rowwise() %>%
mutate(var.max = colnames(.)[which.max(c_across(var2:var4))])
# A tibble: 10 x 5
# Rowwise:
var1 var2 var3 var4 var.max
<dbl> <dbl> <dbl> <dbl> <chr>
1 -1.38 1.07 1.47 -0.414 var2
2 -0.327 -0.695 0.0222 -0.550 var2
3 0.256 -0.0696 -0.347 0.640 var3
4 0.603 1.24 -0.724 -0.199 var1
5 1.31 -0.580 -0.0149 -0.877 var2
6 -1.24 0.413 -1.00 -1.20 var1
7 -0.413 3.83 -1.42 -0.675 var1
8 1.73 0.586 0.402 1.46 var3
9 1.30 1.65 0.760 0.646 var1
10 -0.235 2.04 -0.115 0.325 var1
但是,如果列 var1 被排除在它起作用的数据之外:
dat %>%
select(-var1) %>%
rowwise() %>%
mutate(var.max = colnames(.)[which.max(c_across(var2:var4))])
# A tibble: 10 x 4
# Rowwise:
var2 var3 var4 var.max
<dbl> <dbl> <dbl> <chr>
1 1.07 1.47 -0.414 var3
2 -0.695 0.0222 -0.550 var3
3 -0.0696 -0.347 0.640 var4
4 1.24 -0.724 -0.199 var2
5 -0.580 -0.0149 -0.877 var3
6 0.413 -1.00 -1.20 var2
7 3.83 -1.42 -0.675 var2
8 0.586 0.402 1.46 var4
9 1.65 0.760 0.646 var2
10 2.04 -0.115 0.325 var2
.. 就像 var1 位于最后一个位置时一样:
dat %>%
select(var2, var3, var4, var1) %>%
rowwise() %>%
mutate(var.max = colnames(.)[which.max(c_across(var2:var4))])
# A tibble: 10 x 5
# Rowwise:
var2 var3 var4 var1 var.max
<dbl> <dbl> <dbl> <dbl> <chr>
1 1.07 1.47 -0.414 -1.38 var3
2 -0.695 0.0222 -0.550 -0.327 var3
3 -0.0696 -0.347 0.640 0.256 var4
4 1.24 -0.724 -0.199 0.603 var2
5 -0.580 -0.0149 -0.877 1.31 var3
6 0.413 -1.00 -1.20 -1.24 var2
7 3.83 -1.42 -0.675 -0.413 var2
8 0.586 0.402 1.46 1.73 var4
9 1.65 0.760 0.646 1.30 var2
10 2.04 -0.115 0.325 -0.235 var2
我在这里错过了什么?
【问题讨论】:
-
试试
names(dat)[max.col(dat)] -
不起作用(或者我没有正确使用它?):
mutate()中的错误:!计算..1 = names(dat)[max.col(dat)]时出现问题。 x..1必须是 1 码,而不是 10 码。您是说:..1 = list(names(dat)[max.col(dat)])吗? i 错误发生在第 1 行。 -
您共享的此数据的一个简单修复是在
which.max()索引处添加 +1,即mutate(var.max = colnames(.)[which.max(c_across(var2:var4))] + 1) -
mutate()Sotos 错误@:!计算var.max = colnames(.)[which.max(c_across(var2:var4))] + 1时出现问题。 i 错误发生在第 1 行。由colnames(.)[which.max(c_across(var2:var4))] + 1中的错误引起:!二元运算符的非数字参数