我尝试将函数应用于仅包含特定行的data.frame
。
我的目标是有一个第五列,其中包含一个根据组和func
而变化的函数。假设我想在func=a
的情况下执行 t - 测试,并计算案例func=b
的平均差异。换句话说,第五列中的前三行应包含t.test
(t.test(n1[1:3],n2[1:3])$p.value
)与n1
组中n2
和1
进行比较的结果 n1<-c(58,94,58,94,65,87,65,91,20,16)
n2<-c(37,34,88,23,86,37,80,34,24,67)
group<-c(1,1,1,2,2,2,2,3,3,3)
func<-c('a','a','a','b','b','b','b','a','a','a')
data<-data.frame(n1,n2,group,func)
data
n1 n2 group func
1 58 37 1 a
2 94 34 1 a
3 58 88 1 a
4 94 23 2 b
5 65 86 2 b
6 87 37 2 b
7 65 80 2 b
8 91 34 3 a
9 20 24 3 a
10 16 67 3 a
}。这怎么可能?
pvalue1<-t.test(c(58,94,58),c(37,34,88))$p.value
pvalue2<-chisq.test(c(94,65,87,65),c(23,86,37,80))$p.value
pvalue3<-t.test(c(91,20,16),c(34,24,67))$p.value
pvalue<-c(rep(pvalue1,3),rep(pvalue2,4),rep(pvalue3,3))
cbind(data,pvalue)
n1 n2 group func pvalue
1 58 37 1 a 0.4737073
2 94 34 1 a 0.4737073
3 58 88 1 a 0.4737073
4 94 23 2 b 0.2381033
5 65 86 2 b 0.2381033
6 87 37 2 b 0.2381033
7 65 80 2 b 0.2381033
8 91 34 3 a 0.9822272
9 20 24 3 a 0.9822272
10 16 67 3 a 0.9822272
修改
手动我可以这样做。但是,如果我有100个以上的100行以上的行,我能做到吗?
$numbers = Get-Content 'C:\temp\file.txt'
$i = 1
foreach($n in $numbers){
Write-host "Number $i - $n"
$i++
}
$n = Read-host "Choose a number"
$chosenNumber = $number[$n-1]
答案 0 :(得分:1)
您可以使用dplyr
进行计算:
library(dplyr)
my_df %>%
group_by(group) %>%
mutate(p_value = ifelse(func == 'a', t.test(n1, n2)$p.value, chisq.test(n1, n2)$p.value))
# A tibble: 10 x 5
# Groups: group [3]
# n1 n2 group func p_value
# <dbl> <dbl> <dbl> <fct> <dbl>
# 1 58. 37. 1. a 0.474
# 2 94. 34. 1. a 0.474
# 3 58. 88. 1. a 0.474
# 4 94. 23. 2. b 0.238
# 5 65. 86. 2. b 0.238
# 6 87. 37. 2. b 0.238
# 7 65. 80. 2. b 0.238
# 8 91. 34. 3. a 0.982
# 9 20. 24. 3. a 0.982
# 10 16. 67. 3. a 0.982
答案 1 :(得分:0)
我在Hadley的R4DS书中看到了一些很酷的东西。 Check this out for an example and some discussion around my approach below.
以下内容可以实现您的目标:
library(dplyr)
library(purrr)
library(tidyr)
test_function <- function(func, data) {
if (func == "a") {t.test(data$n1, data$n2)$p.value}
else if (func == "b") {chisq.test(data$n1, data$n2)$p.value}
}
df %>%
group_by(group, func) %>%
nest() %>%
mutate(p_value = map2_dbl(func, data, function(x, y) test_function(x, y)))
%>% unnest()
答案 2 :(得分:0)
考虑基础R未充分利用by()
,它可以将数据帧分割一个或多个因子,然后将子集传递给定义或匿名函数,返回函数输出列表。
数据 (假设函数是字符串)
n1 <- c(58,94,58,94,65,87,65,91,20,16)
n2 <- c(37,34,88,23,86,37,80,34,24,67)
group <- c(1,1,1,2,2,2,2,3,3,3)
func < -c('t.test','t.test','t.test','chisq.test','chisq.test',
'chisq.test','chisq.test','t.test','t.test','t.test')
data <- data.frame(n1,n2,group,func)
通过处理(使用get()检索实际功能):
data_list <- by(data, data$group, function(sub){
func <- print(as.character(sub$func[[1]]))
f <- get(func)
sub$pvalue <- f(sub$n1, sub$n2)$p.value
return(sub)
})
final_df <- do.call(rbind, data_list)
final_df
# n1 n2 group func pvalue
# 1.1 58 37 1 t.test 0.4737073
# 1.2 94 34 1 t.test 0.4737073
# 1.3 58 88 1 t.test 0.4737073
# 2.4 94 23 2 chisq.test 0.2381033
# 2.5 65 86 2 chisq.test 0.2381033
# 2.6 87 37 2 chisq.test 0.2381033
# 2.7 65 80 2 chisq.test 0.2381033
# 3.8 91 34 3 t.test 0.9822272
# 3.9 20 24 3 t.test 0.9822272
# 3.10 16 67 3 t.test 0.9822272