R - 跨数据集的所有行应用函数 (combinevar)
R - apply a function (combinevar) across all rows of a dataset
我有一个数据集,其中每一行都包含 combinevar 函数所需的数据(package = fishmethods;combinevar 结合来自两个分布的信息以得出组合方差)。
xbar1 = c(2,2,1,4,3)
xbar2 = c(0,0,0,0,0)
var1 = c(0,1,3,2,1)
var2 = c(0,0,0,0,0)
n1 = c(50,10,30,40,50)
n2 = c(3,4,50,32,20)
df <- data.frame(xbar1, xbar2, var1, var2, n1, n2)
xbar1 xbar2 var1 var2 n1 n2
2 0 0 0 50 3
2 0 1 0 10 4
1 0 3 0 30 50
4 0 2 0 40 32
3 0 1 0 50 20
我将如何跨行应用函数。我可以像这样在 for 循环中执行此操作:
for (i in 1:nrow(df)) {
combined_var <- combinevar(xbar = c(df$xbar1[i], df$xbar2[i]),
s_squared = c(df$var1[i], df$var2[i]),
n = c(df$n1[i], df$n2[i]))[2]
print(combined_var)
}
[1] 0.2177068
[1] 1.571429
[1] 1.338608
[1] 5.104851
[1] 2.573499
但我确信有更好的方法。我想我可以用一个应用函数来做,但我不知道怎么做。
我们可以按行嵌套数据,然后为每一行映射函数。
library(tidyverse)
library(fishmethods)
df %>%
rownames_to_column("row") %>%
nest(-row) %>%
mutate(combined_var = map(data, ~combinevar(xbar = c(.x$xbar1, .x$xbar2),
s_squared = c(.x$var1, .x$var2),
n = c(.x$n1, .x$n2))[2])) %>%
unnest()
#> row combined_var xbar1 xbar2 var1 var2 n1 n2
#> 1 1 0.2177068 2 0 0 0 50 3
#> 2 2 1.5714286 2 0 1 0 10 4
#> 3 3 1.3386076 1 0 3 0 30 50
#> 4 4 5.1048513 4 0 2 0 40 32
#> 5 5 2.5734990 3 0 1 0 50 20
或者我们可以按行应用函数
df %>%
rowwise() %>%
mutate(combined_var = combinevar(xbar = c(xbar1, xbar2),
s_squared = c(var1, var2),
n = c(n1, n2))[2])
#> Source: local data frame [5 x 7]
#> Groups: <by row>
#>
#> # A tibble: 5 x 7
#> xbar1 xbar2 var1 var2 n1 n2 combined_var
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 2 0 0 0 50 3 0.218
#> 2 2 0 1 0 10 4 1.57
#> 3 1 0 3 0 30 50 1.34
#> 4 4 0 2 0 40 32 5.10
#> 5 3 0 1 0 50 20 2.57
由 reprex 创建于 2018-08-19
包 (v0.2.0).
您可以对行使用应用函数并指定函数正确读取行:
library(fishmethods)
my_function<- function(vec){
combined_var <- combinevar(xbar = c(vec[1], vec[2]), s_squared = c(vec[3], vec[4]), n = c(vec[5], vec[6]))
}
apply(df, 1, my_function) [2, ]
我有一个数据集,其中每一行都包含 combinevar 函数所需的数据(package = fishmethods;combinevar 结合来自两个分布的信息以得出组合方差)。
xbar1 = c(2,2,1,4,3)
xbar2 = c(0,0,0,0,0)
var1 = c(0,1,3,2,1)
var2 = c(0,0,0,0,0)
n1 = c(50,10,30,40,50)
n2 = c(3,4,50,32,20)
df <- data.frame(xbar1, xbar2, var1, var2, n1, n2)
xbar1 xbar2 var1 var2 n1 n2
2 0 0 0 50 3
2 0 1 0 10 4
1 0 3 0 30 50
4 0 2 0 40 32
3 0 1 0 50 20
我将如何跨行应用函数。我可以像这样在 for 循环中执行此操作:
for (i in 1:nrow(df)) {
combined_var <- combinevar(xbar = c(df$xbar1[i], df$xbar2[i]),
s_squared = c(df$var1[i], df$var2[i]),
n = c(df$n1[i], df$n2[i]))[2]
print(combined_var)
}
[1] 0.2177068
[1] 1.571429
[1] 1.338608
[1] 5.104851
[1] 2.573499
但我确信有更好的方法。我想我可以用一个应用函数来做,但我不知道怎么做。
我们可以按行嵌套数据,然后为每一行映射函数。
library(tidyverse)
library(fishmethods)
df %>%
rownames_to_column("row") %>%
nest(-row) %>%
mutate(combined_var = map(data, ~combinevar(xbar = c(.x$xbar1, .x$xbar2),
s_squared = c(.x$var1, .x$var2),
n = c(.x$n1, .x$n2))[2])) %>%
unnest()
#> row combined_var xbar1 xbar2 var1 var2 n1 n2
#> 1 1 0.2177068 2 0 0 0 50 3
#> 2 2 1.5714286 2 0 1 0 10 4
#> 3 3 1.3386076 1 0 3 0 30 50
#> 4 4 5.1048513 4 0 2 0 40 32
#> 5 5 2.5734990 3 0 1 0 50 20
或者我们可以按行应用函数
df %>%
rowwise() %>%
mutate(combined_var = combinevar(xbar = c(xbar1, xbar2),
s_squared = c(var1, var2),
n = c(n1, n2))[2])
#> Source: local data frame [5 x 7]
#> Groups: <by row>
#>
#> # A tibble: 5 x 7
#> xbar1 xbar2 var1 var2 n1 n2 combined_var
#> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl> <dbl>
#> 1 2 0 0 0 50 3 0.218
#> 2 2 0 1 0 10 4 1.57
#> 3 1 0 3 0 30 50 1.34
#> 4 4 0 2 0 40 32 5.10
#> 5 3 0 1 0 50 20 2.57
由 reprex 创建于 2018-08-19 包 (v0.2.0).
您可以对行使用应用函数并指定函数正确读取行:
library(fishmethods)
my_function<- function(vec){
combined_var <- combinevar(xbar = c(vec[1], vec[2]), s_squared = c(vec[3], vec[4]), n = c(vec[5], vec[6]))
}
apply(df, 1, my_function) [2, ]