1

这可能是一个非常基本的问题,但似乎我很难理解 R 中的点 (.)。在下面的示例中,我使用rowSums了两列的总和。但我不明白 rowSums 中点的作用。有人可以帮我理解这一点吗?

df1 <- data.frame(fruits = c("Apple", "Apple","Apple", "Mango", "Mango", "Kiwi", "Kiwi"), 
                  prices1 = c(10, NA, NA, 15, NA, 20, NA), prices2 = c(NA, 12, NA, NA, 17, NA, 22), 
                  prices3 = c(NA, NA, 14, NA, 21, NA, 25),
                  weights = c(20, 20, 20, 25, 25, 30, 30),
                  quality = c("Good", "Good", "Good", "Better", "Better", "Best", "Best"))

df1 %>% replace(is.na(.), 0) %>% mutate(sum = rowSums(.[2:3]))

4

3 回答 3

1

点表示df1 %>% replace(is.na(.), 0)将评估的任何内容。点伴随%>%,管。

从帮助页面:

help("%>%")

将 lhs 放在 rhs 调用中的其他位置

通常你会想lhs在第rhs一个位置以外的另一个位置跟注。为此,您可以使用点 (.) 作为占位符。例如,y %>% f(x, .)等价于f(x, y)z %>% f(x, y, arg = .)等价于f(x, y, arg = z)

将点用于次要目的

通常,除了自身的值(例如行数或列数)之外,调用中还lhs需要 的某些属性或属性。在 rhs 调用中多次使用点占位符是完全有效的,但根据设计,在嵌套函数调用中使用它时行为会略有不同。特别是,如果占位符只在嵌套函数调用中使用,lhs 也将作为第一个参数放置!这样做的原因是,在大多数用例中,这会产生最易读的代码。例如,等效于但稍微更紧凑。可以通过将 in 括起来来推翻这种行为。例如,等价于。rhslhsiris %>% subset(1:nrow(.) %% 2 == 0)iris %>% subset(., 1:nrow(.) %% 2 == 0)rhs1:10 %>% {c(min(.), max(.))}c(min(1:10), max(1:10))

于 2021-05-23T16:49:09.857 回答
0

基础 R 解决方案:

df1$sum <- rowSums(df1[, 2:3], na.rm = TRUE)
df1
  fruits prices1 prices2 prices3 weights quality sum
1  Apple      10      NA      NA      20    Good  10
2  Apple      NA      12      NA      20    Good  12
3  Apple      NA      NA      14      20    Good   0
4  Mango      15      NA      NA      25  Better  15
5  Mango      NA      17      21      25  Better  17
6   Kiwi      20      NA      NA      30    Best  20
7   Kiwi      NA      22      25      30    Best  22

那是假设您只想替换 NA 来进行求和。(不需要)我不清楚为什么更复杂的 tidyverse 解决方案是默认的,而不是通常更简单的基础 R。

于 2021-05-23T17:46:05.487 回答
0

你可能想要:

df1 %>% replace(is.na(.), 0) %>% select(2:3) %>% mutate(sum = rowSums(.))
  prices1 prices2 sum
1      10       0  10
2       0      12  12
3       0       0   0
4      15       0  15
5       0      17  17
6      20       0  20
7       0      22  22

您需要select首先使用您想要的行rowSums,然后使用,.因为数据框现在仅包含选定的两列

于 2021-05-23T16:52:33.523 回答