按行应用R函数:数据帧问题
我在R中创建一个函数时遇到了问题,该函数允许我对数据帧的每一行应用一个单独的函数,并将该函数的输出保存回数据帧 一个简单的可复制示例(使用我希望按行应用的外部包/函数): 我想做的是…:按行应用R函数:数据帧问题,r,function,R,Function,我在R中创建一个函数时遇到了问题,该函数允许我对数据帧的每一行应用一个单独的函数,并将该函数的输出保存回数据帧 一个简单的可复制示例(使用我希望按行应用的外部包/函数): 我想做的是…: df$pwr = pwr.t2n.test(n1= df$n1, n2 = df$n2, d = NULL, sig.level = .05, power = .80)[3] 其中,我从数据框中输入函数n1和n2参数的n1和n2列。我收到了许多令人不快的错误/警告 当我尝试使用adply按行应用此函数时,会出
df$pwr = pwr.t2n.test(n1= df$n1, n2 = df$n2, d = NULL, sig.level = .05, power = .80)[3]
其中,我从数据框中输入函数n1和n2参数的n1和n2列。我收到了许多令人不快的错误/警告
当我尝试使用adply按行应用此函数时,会出现相同的错误/警告:
df= adply(df, 1, transform, pwr = pwr.t2n.test(n1= df$n1, n2 = df$n2, d = NULL, sig.level = .05, power = .80)[3])
但是,如果我一次对一行应用pwr()函数,为n1和n2参数指定数据帧中的行和列位置,那么我就没有问题:
pwr.t2n.test(n1= df[1,1], n2 = df[1,2], d = NULL, sig.level = .05, power = .80)[3]
= [1] 0.836982
pwr.t2n.test(n1= df[2,1], n2 = df[2,2], d = NULL, sig.level = .05, power = .80)[3]
= [1] 0.5398989
我想知道是否有某种方法可以使用pwr()函数本身,或者使用adply或类似的方法,以便在更大的数据帧中应用此函数,并保存每行的结果(考虑到它们的n1和n2参数) 您可以使用索引使
apply
工作:
test <- apply(df, 1, function(x){
pwr.t2n.test(n1 = x[1], n2 = x[2], d = NULL, sig.level = .05, power = .80)
})
[[1]]
t test power calculation
n1 = 22
n2 = 25
d = 0.836982
sig.level = 0.05
power = 0.8
alternative = two.sided
[[2]]
t test power calculation
n1 = 70
n2 = 45
d = 0.5398989
sig.level = 0.05
power = 0.8
alternative = two.sided
您可以使用索引使
apply
工作:
test <- apply(df, 1, function(x){
pwr.t2n.test(n1 = x[1], n2 = x[2], d = NULL, sig.level = .05, power = .80)
})
[[1]]
t test power calculation
n1 = 22
n2 = 25
d = 0.836982
sig.level = 0.05
power = 0.8
alternative = two.sided
[[2]]
t test power calculation
n1 = 70
n2 = 45
d = 0.5398989
sig.level = 0.05
power = 0.8
alternative = two.sided
@LAP对base-R所做的改进版本:
library(purrr)
map_dfr(transpose(df), function(params){
list(n1 = params$n1,
n2 = params$n2,
pw = pwr.t2n.test(n1 = params$n1, n2 = params$n2, d = NULL, sig.level = 0.05, power = 0.8)$d
)
})
# A tibble: 2 x 3
n1 n2 pw
<dbl> <dbl> <dbl>
1 22 25 0.837
2 70 45 0.540
库(purrr)
map_dfr(转置(df)、函数(params){
列表(n1=参数$n1,
n2=参数$n2,
pw=pwr.t2n.测试(n1=params$n1,n2=params$n2,d=NULL,信号电平=0.05,功率=0.8)$d
)
})
#一个tibble:2x3
n1 n2 pw
1 22 25 0.837
2 70 45 0.540
正如在基准测试后进行提醒一样,@LAP的解决方案看起来要快得多,所以如果你担心速度,就使用他们的解决方案
编辑以解决后续问题:
n1=c(22,70)
n2=c(25,45)
char_vec=c('h','i'))
df=数据帧(n1,n2,字符向量,字符串因子=FALSE)
map_dfr(转置(df)、函数(params){
#浏览器()
列表(n1=参数$n1,
n2=参数$n2,
pw=pwr.t2n.测试(n1=params$n1,n2=params$n2,d=NULL,信号电平=0.05,功率=0.8)$d,
a_character_vec=参数$char_vec
)
})
#一个tibble:2x4
n1 n2 pw a_字符向量
12225 0.837小时
270450.540I
是@LAP对base-R所做的一个精简版本:
library(purrr)
map_dfr(transpose(df), function(params){
list(n1 = params$n1,
n2 = params$n2,
pw = pwr.t2n.test(n1 = params$n1, n2 = params$n2, d = NULL, sig.level = 0.05, power = 0.8)$d
)
})
# A tibble: 2 x 3
n1 n2 pw
<dbl> <dbl> <dbl>
1 22 25 0.837
2 70 45 0.540
库(purrr)
map_dfr(转置(df)、函数(params){
列表(n1=参数$n1,
n2=参数$n2,
pw=pwr.t2n.测试(n1=params$n1,n2=params$n2,d=NULL,信号电平=0.05,功率=0.8)$d
)
})
#一个tibble:2x3
n1 n2 pw
1 22 25 0.837
2 70 45 0.540
正如在基准测试后进行提醒一样,@LAP的解决方案看起来要快得多,所以如果你担心速度,就使用他们的解决方案
编辑以解决后续问题:
n1=c(22,70)
n2=c(25,45)
char_vec=c('h','i'))
df=数据帧(n1,n2,字符向量,字符串因子=FALSE)
map_dfr(转置(df)、函数(params){
#浏览器()
列表(n1=参数$n1,
n2=参数$n2,
pw=pwr.t2n.测试(n1=params$n1,n2=params$n2,d=NULL,信号电平=0.05,功率=0.8)$d,
a_character_vec=参数$char_vec
)
})
#一个tibble:2x4
n1 n2 pw a_字符向量
12225 0.837小时
270450.540I
+1感谢您展示了如何使用apply实现这一点。当我将此解决方案用于我感兴趣的(更大的)数据帧时,它抛出了一个奇怪的错误(抱怨n1和/或n2的某些行的观测值小于2(我用min()仔细检查了这一点,事实并非如此)。有趣的是,下面@zack的解决方案并没有出现相同的错误。奇怪。您的数据中是否有NA
?可能是purr
自动排除了这些错误。无论如何,很高兴您为您的问题找到了一个有效的解决方案!+1感谢您展示了如何使用apply完成此操作。当我将此解决方案用于我的(更大的)时有趣的数据帧,它抛出了一个奇怪的错误(抱怨n1和/或n2的某些行的观测值小于2(我用min()仔细检查了这一点,事实并非如此)。有趣的是,下面@zack的解决方案并没有出现相同的错误。奇怪。你的数据中是否有NA
?可能是purr
自动排除了这些。无论如何,很高兴你为你的问题找到了一个有效的解决方案!+1.太棒了,谢谢你(这是我需要学习purr的一个很好的例子)。有没有一种简单的方法可以将原始数据帧中的两个字符向量转移到新的TIBLE中?看起来生成的新TIBLE是以不同的顺序排列的,所以我不能简单地复制它。如果我理解正确,这不应该是一个问题-我已经更新了答案,以包含一个额外的字符向量e> char_vec在原始数据帧中,以及a_character_vec
在生成的数据帧中。这正是我所需要的!+1.非常感谢(这是我需要学习purrr的一个很好的例子)。有没有一种简单的方法可以将原始数据帧中的两个字符向量转移到新的TIBLE中?看起来生成的新TIBLE是以不同的顺序排列的,所以我不能简单地复制它。如果我理解正确,这不应该是一个问题-我已经更新了答案,以包含一个额外的字符向量e> char_vec在原始数据帧中,以及一个character_vec
在结果数据帧中。这正是我所需要的!
n1 = c(22, 70)
n2 = c(25, 45)
char_vec = c('h', 'i')
df = data.frame(n1, n2, char_vec, stringsAsFactors = FALSE)
map_dfr(transpose(df), function(params){
# browser()
list(n1 = params$n1,
n2 = params$n2,
pw = pwr.t2n.test(n1 = params$n1, n2 = params$n2, d = NULL, sig.level = 0.05, power = 0.8)$d,
a_character_vec = params$char_vec
)
})
# A tibble: 2 x 4
n1 n2 pw a_character_vec
<dbl> <dbl> <dbl> <chr>
1 22 25 0.837 h
2 70 45 0.540 i