r语言 - 如何在数据框架中使用维度而不是列名进行变异?



下面这段代码很好地计算并输出了data数据框中每个元素所表示的行总数的比例:

输出:

# A tibble: 4 x 5
# Rowwise: 
To        A     B     C   Sum
<chr> <dbl> <dbl> <dbl> <dbl>
1 A     0.111 0.333 0.556     1
2 B     0.167 0.333 0.5       1
3 C     0.25  0.312 0.438     1
4 Sum   0.189 0.324 0.486     1

生成上述代码:

library(dplyr)
library(tidyverse)
data <- 
data.frame(
To = c("A","B","C"),
A = c(1,2,4),
B = c(3,4,5),
C = c(5,6,7)
)
data <- data %>% 
replace(is.na(.), 0) %>%
bind_rows(summarise_all(., ~(if(is.numeric(.)) sum(.) else "Sum")))
data <- cbind(data, Sum = rowSums(data[,-1]))
data %>% 
rowwise() %>%
mutate(across(A:Sum, ~ sum(.) / Sum))

上述mutate(across(...)...)引用起始列A作为计算起点,是正确的。但是,在较大的应用程序中,列名是动态的。因此,我只想从数据框中的第一个数字列开始,而不是使用它的名称。下面是我的尝试:

data %>% 
rowwise() %>%
mutate(across(-1:Sum, ~ sum(.) / Sum))

计算正确,但给出如下所示的警告。有更好的方法吗?而不是诱人的suppressWarnings()?

警告消息:mutate()输入..1的问题。i..1 = across(-1:Sum, ~sum(.)/Sum)。1个数值表达式有4个元素:只使用第一个i警告发生在第1行

您可以使用谓词函数,封装在where()

data %>% 
rowwise() %>%
mutate(across(where(is.numeric), ~ sum(.) / Sum))

您也可以取消选择第一列的名称或其索引,如以下示例:

data %>% 
rowwise() %>%
mutate(across(-1, ~ sum(.) / Sum))
data %>% 
rowwise() %>%
mutate(across(-To, ~ sum(.) / Sum))

最新更新