我有一个长格式的dataframe (每个参与者90行)。在这个数据中是一个有反应时间的列。还有另一列(两个级别“匹配”和“不匹配”的因素)。
我想要计算一个指数,看起来是这样的:不匹配的平均RT --匹配的平均RT。我添加了na.rm=TRUE,因为每一行都有RTs,但不是每一行都有匹配或不匹配,有些也是NAs。
mean(dato$MMRT [dato$Matcheig == "mismatch"], na.rm=TRUE) - mean(dato$MMRT [dato$Matcheig == "match"], na.rm=TRUE)
如何为每个参与者获得这90行的索引?我更喜欢一个新的数据框架,为每个参与者提供一行(VP)和一个列及其索引。
我对dplyr尽了最大的努力,但老实说,我昨天才听说(我是新来的),也许有人能告诉我是否有一个简单的解决办法。
datindex <- dato %>%
+ group_by(VP) %>%
+ mean(dato$MMRT [dato$Matcheig == "mismatch"], na.rm=TRUE) - mean(dato$MMRT [dato$Matcheig == "match"], na.rm=TRUE)
这给出了错误“参数不是数字或逻辑的:返回NA”和带有NA的1x1数据帧。
示例: dato如下所示(现在每个参与者只有5行):
VP MMRT Matcheig
1 868 match
1 640 match
1 683 mismatch
1 643 NA
1 904 mismatch
2 705 mismatch
2 634 match
2 819 match
2 700 mismatch
2 765 mismatch
结果应该如下所示:
VP index
1 39.5
2 -3.2
因为参与者1的不匹配的平均RT为793.5,而匹配的RT为754。
-> 793.5 - 754 = 39.5
参与者2:平均RT(不匹配)= 723.3,平均RT(匹配)= 726.5
-> 723.3 - 726.5 = -3.2
发布于 2020-06-12 23:58:17
1)您不应该在$
管道中使用dplyr
,它们很少有用。
2)应该将summarise
或mutate
函数中的计算包含在dplyr
中。
library(dplyr)
dato %>%
group_by(VP) %>%
summarise(calc = mean(MMRT[Matcheig == "mismatch"], na.rm=TRUE) -
mean(MMRT[Matcheig == "match"], na.rm=TRUE))
# A tibble: 2 x 2
# VP calc
# <int> <dbl>
#1 1 39.5
#2 2 -3.17
同样也可以使用类似的方式使用data.table
,这对于大型数据集很有用。
library(data.table)
setDT(dato)[, (mean(MMRT[Matcheig == "mismatch"], na.rm=TRUE) -
mean(MMRT[Matcheig == "match"], na.rm=TRUE)), VP]
https://stackoverflow.com/questions/62356884
复制