为什么 sum() 在应用于数据帧时不会产生与加法相同的值?
Why does sum() not produce the same values as addition when applied to a dataframe?
出于好奇:我认为可以使用 sum() 在 R 数据帧中创建一个新变量 - objective 正在计算几个单一值的总分。但是 sum() 显然是对一列中的所有值求和,而不仅仅是单个案例的值。这背后的机制是什么?是否有一个函数可以像简单的加法那样将值相加?
Daten <- data.frame(
cases = c("first", "second", "third"),
values1= c(1,2,3),
values2= c(27,19,34),
values3= c(2,8,7)
)
Daten$valcomb = sum(Daten$values1,Daten$values2,Daten$values3)
Daten$valcomb2 = Daten$values1+Daten$values2+Daten$values3
print(Daten)
输出
cases values1 values2 values3 valcomb valcomb2
1 first 1 27 2 103 30
2 second 2 19 8 103 29
3 third 3 34 7 103 44
如果要对行求和,则需要使用 rowSums
而不是 sum
。显然,您不能包含非数字 cases
列,因此您需要 rowSums(Daten[-1])
来计算数字行的总和。
within(Daten, sums <- rowSums(Daten[-1]))
#> cases values1 values2 values3 sums
#> 1 first 1 27 2 30
#> 2 second 2 19 8 29
#> 3 third 3 34 7 44
或者,如果您使用 dplyr
:
Daten %>% mutate(sums = rowSums(.[-1]))
#> cases values1 values2 values3 sums
#> 1 first 1 27 2 30
#> 2 second 2 19 8 29
#> 3 third 3 34 7 44
这与 data.frames 无关,而是关于 + as 运算符的行为与 sum()
作为函数的行为。
在向量上使用 + 运算符,它将对每个向量元素求和
c(1,2,3) + c(27,19,34) + c(2,8,7)
# [1] 30 29 44
请注意,如果长度可能不相等或仅发出警告,它会回收长度。
c(1,2,3,4) + c(27,19,34) + c(2,8,7)
# [1] 30 29 44 33
# Warning messages:
# 1: In c(1, 2, 3, 4) + c(27, 19, 34) :
# longer object length is not a multiple of shorter object length
# 2: In c(1, 2, 3, 4) + c(27, 19, 34) + c(2, 8, 7) :
# longer object length is not a multiple of shorter object length
在向量上使用 sum()
函数时,它将根据函数的定义对所有值求和。
sum(c(1,2,3), c(27,19,34), c(2,8,7))
# [1] 103
更新
除了关于 + 运算符和求和函数行为的一些理论,这里还有一个使用一些函数处理 data.frame 数据的示例。
library(dplyr)
Daten %>%
# sums all columns that yield numeric values
mutate(sum_all = rowSums(across(where(is.numeric)))) %>%
# sums values1 and values3
mutate(sum_1_3 = rowSums(across(c("values1", "values3"))))
# cases values1 values2 values3 sum_all sum_1_3
# 1 first 1 27 2 30 3
# 2 second 2 19 8 29 10
# 3 third 3 34 7 44 10
出于好奇:我认为可以使用 sum() 在 R 数据帧中创建一个新变量 - objective 正在计算几个单一值的总分。但是 sum() 显然是对一列中的所有值求和,而不仅仅是单个案例的值。这背后的机制是什么?是否有一个函数可以像简单的加法那样将值相加?
Daten <- data.frame(
cases = c("first", "second", "third"),
values1= c(1,2,3),
values2= c(27,19,34),
values3= c(2,8,7)
)
Daten$valcomb = sum(Daten$values1,Daten$values2,Daten$values3)
Daten$valcomb2 = Daten$values1+Daten$values2+Daten$values3
print(Daten)
输出
cases values1 values2 values3 valcomb valcomb2
1 first 1 27 2 103 30
2 second 2 19 8 103 29
3 third 3 34 7 103 44
如果要对行求和,则需要使用 rowSums
而不是 sum
。显然,您不能包含非数字 cases
列,因此您需要 rowSums(Daten[-1])
来计算数字行的总和。
within(Daten, sums <- rowSums(Daten[-1]))
#> cases values1 values2 values3 sums
#> 1 first 1 27 2 30
#> 2 second 2 19 8 29
#> 3 third 3 34 7 44
或者,如果您使用 dplyr
:
Daten %>% mutate(sums = rowSums(.[-1]))
#> cases values1 values2 values3 sums
#> 1 first 1 27 2 30
#> 2 second 2 19 8 29
#> 3 third 3 34 7 44
这与 data.frames 无关,而是关于 + as 运算符的行为与 sum()
作为函数的行为。
在向量上使用 + 运算符,它将对每个向量元素求和
c(1,2,3) + c(27,19,34) + c(2,8,7)
# [1] 30 29 44
请注意,如果长度可能不相等或仅发出警告,它会回收长度。
c(1,2,3,4) + c(27,19,34) + c(2,8,7)
# [1] 30 29 44 33
# Warning messages:
# 1: In c(1, 2, 3, 4) + c(27, 19, 34) :
# longer object length is not a multiple of shorter object length
# 2: In c(1, 2, 3, 4) + c(27, 19, 34) + c(2, 8, 7) :
# longer object length is not a multiple of shorter object length
在向量上使用 sum()
函数时,它将根据函数的定义对所有值求和。
sum(c(1,2,3), c(27,19,34), c(2,8,7))
# [1] 103
更新
除了关于 + 运算符和求和函数行为的一些理论,这里还有一个使用一些函数处理 data.frame 数据的示例。
library(dplyr)
Daten %>%
# sums all columns that yield numeric values
mutate(sum_all = rowSums(across(where(is.numeric)))) %>%
# sums values1 and values3
mutate(sum_1_3 = rowSums(across(c("values1", "values3"))))
# cases values1 values2 values3 sum_all sum_1_3
# 1 first 1 27 2 30 3
# 2 second 2 19 8 29 10
# 3 third 3 34 7 44 10