我有一个数据框,其中包含同一进程的两个观察者的独立计数。
obs.1 <- c(2,10,53,13,12,15,5)
obs.2 <- c(3,12,45,2,7,17,5)
df <- data.frame(obs.1,obs.2)
我想在每一行上使用卡方检验(R“MASS”中的chisq.test)来检查obs.1与obs.2之间是否存在显着差异。我想将结果(x平方,p值)添加到df。我觉得apply函数是实现它的正确方法,但还没有成功。
答案 0 :(得分:4)
以下是使用dplyr
的另一个选项:
library(dplyr)
df %>%
rowwise() %>%
mutate(
test_stat = chisq.test(c(obs.1, obs.2))$statistic,
p_val = chisq.test(c(obs.1, obs.2))$p.value
)
答案 1 :(得分:2)
有很多方法可以做到这一点。一个是使用apply
遍历每一行(MARGINE = 1
),然后提取所需输出的任何部分(我使用lapply
来浏览每个列表元素)。
xy <- data.frame(obs1 = c(3,12,45,2,7,17,5), obs2 = c(2,10,53,13,12,15,5))
result <- apply(X = xy, MARGIN = 1, FUN = chisq.test)
Warning message:
In FUN(newX[, i], ...) : Chi-squared approximation may be incorrect
# see where p-value is stored
str(chisq.test(xy[1, ]))
List of 9
$ statistic: Named num 0.2
..- attr(*, "names")= chr "X-squared"
$ parameter: Named num 1
..- attr(*, "names")= chr "df"
$ p.value : num 0.655 # thar she blows
$ method : chr "Chi-squared test for given probabilities"
$ data.name: chr "xy[1, ]"
$ observed : num [1:2] 3 2
$ expected : num [1:2] 2.5 2.5
$ residuals: num [1:2] 0.316 -0.316
$ stdres : num [1:2] 0.447 -0.447
- attr(*, "class")= chr "htest"
Warning message:
In chisq.test(xy[1, ]) : Chi-squared approximation may be incorrect
unlist(lapply(result, "[", "p.value"), use.names = FALSE)
[1] 0.654720846 0.669815358 0.419020334 0.004508698 0.251349109 0.723673610 1.000000000
答案 2 :(得分:2)
您可以将apply
与“MARGIN = 1”一起使用,然后执行chisq.test
。使用$statistic
和$p.value
及cbind
将值提取到数据集中。
df1 <- cbind(df, t(apply(df, 1, function(x) {
ch <- chisq.test(x)
c(unname(ch$statistic), ch$p.value)})))
colnames(df1)[3:4] <- c('x-squared', 'p-value')