R:将函数应用于仅包含特定行的数据框

时间:2018-04-05 21:22:52

标签: r function

我尝试将函数应用于仅包含特定行的data.frame

我的目标是有一个第五列,其中包含一个根据组和func而变化的函数。假设我想在func=a的情况下执行 t - 测试,并计算案例func=b的平均差异。换句话说,第五列中的前三行应包含t.testt.test(n1[1:3],n2[1:3])$p.value)与n1组中n21进行比较的结果 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]

3 个答案:

答案 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