Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/76.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R中不同变量/列的分类值频率?_R_Count_Aggregate_Rows - Fatal编程技术网

R中不同变量/列的分类值频率?

R中不同变量/列的分类值频率?,r,count,aggregate,rows,R,Count,Aggregate,Rows,我试图从信号检测实验中收集数据,计算命中率、虚警率等 Code Cond bf1 bf2 bf3 bf4 bm1 bm2 bm3 bm4 BAX-011 3 CR FA HIT FA FR CR FA FA 我的变量bf1到bm3是具有级别(hit、fa、cr、fr)的因子 我想计算一下命中率,fa的针对每个参与者(行),但包含变量子集(bf项目和bm项目)。最简单的方法是什么 最后应该是这样的: Code Cond bf1 bf2 bf3 bf4 bm1 bm

我试图从信号检测实验中收集数据,计算命中率、虚警率等

   Code Cond bf1 bf2 bf3 bf4 bm1 bm2 bm3 bm4
BAX-011    3  CR  FA HIT  FA  FR  CR  FA  FA
我的变量bf1到bm3是具有级别
(hit、fa、cr、fr)
的因子

我想计算一下命中率,fa的<代码>针对每个参与者(行),但包含变量子集(
bf项目和bm项目
)。最简单的方法是什么

最后应该是这样的:

   Code Cond bf1 bf2 bf3 bf4 bm1 bm2 bm3 bm4 bf_hits bm_hits bf_fa ...
BAX-011    3  CR  FA HIT  FA  FR  CR  FA  FA       1       0     2 ...
试试这个:

#dummy data
df <- read.table(text="
Code Cond bf1 bf2 bf3 bf4 bm1 bm2 bm3 bm4
BAX-011    3  CR  FA HIT  FA  FR  CR  FA  FA
BAX-012    3  CR  FA HIT  FA  FR  HIT  FA  FA
BAX-013    3  CR  HIT HIT  FA  FR  HIT  FA  FA
", header=TRUE)

#count HITs per bf bm
df$bf_hit <- rowSums(df[,colnames(df)[grepl("bf",colnames(df))]]=="HIT")
df$bm_hit <- rowSums(df[,colnames(df)[grepl("bm",colnames(df))]]=="HIT")

#output
df
#Code Cond bf1 bf2 bf3 bf4 bm1 bm2 bm3 bm4 bf_hit bm_hit
#1 BAX-011    3  CR  FA HIT  FA  FR  CR  FA  FA      1      0
#2 BAX-012    3  CR  FA HIT  FA  FR HIT  FA  FA      1      1
#3 BAX-013    3  CR HIT HIT  FA  FR HIT  FA  FA      2      1
#虚拟数据

df如果我正确理解您的问题,您可能只需要从“重塑2”软件包中探索
melt
dcast
。使用@zx8754的示例数据,尝试以下操作:

library(reshape2)

### Make the data into a "long" format
dfL <- melt(df, id.vars=c("Code", "Cond"))

### Split the existing "variable" column. 
### Here's one way to do that.
dfL <- cbind(dfL, setNames(
  do.call(rbind.data.frame, strsplit(
    as.character(dfL$variable), "(?=\\d)", perl=TRUE)), 
  c("var", "time")))

### This is what the data now look like.
head(dfL)
#      Code Cond variable value var time
# 1 BAX-011    3      bf1    CR  bf    1
# 2 BAX-012    3      bf1    CR  bf    1
# 3 BAX-013    3      bf1    CR  bf    1
# 4 BAX-011    3      bf2    FA  bf    2
# 5 BAX-012    3      bf2    FA  bf    2
# 6 BAX-013    3      bf2   HIT  bf    2

### Use `dcast` to aggregate the data. 
### The default function is "length" which is what you're looking for.
dcast(dfL, Code + Cond ~ var + value, value.var="value")
# Aggregation function missing: defaulting to length
#      Code Cond bf_CR bf_FA bf_HIT bm_CR bm_FA bm_FR bm_HIT
# 1 BAX-011    3     1     2      1     1     2     1      0
# 2 BAX-012    3     1     2      1     0     2     1      1
# 3 BAX-013    3     1     1      2     0     2     1      1

类似这样:
sum(c(“CR”、“FA”、“HIT”、“FA”)==“HIT”)
Thank's!这对向量非常有效。但是,对于data.frame和我的所有参与者,我如何才能做到这一点呢?请尝试我的更新答案。您的代码似乎统计了所有行中的命中率,而不仅仅是一行中的命中率。至少,如果我将其应用到包含多行/参与者的数据框中,@zx8754,对于“重塑2”:-@user2983485如果有帮助,请向上投票或接受作为答案。@AnandaMahto可能不是学习R的最佳方法,但我更喜欢使用基本R包的解决方案。如果太复杂,我会寻找合适的软件包。@zx8754,请参阅我的更新。如果你看看我的个人资料,特别是我回答的问题,我通常会提出很多基本的解决方案。
X <- grep("^bf|^bm", names(df))
df[X] <- lapply(df[X], as.character)
dfL <- cbind(dfL, setNames(
  do.call(rbind.data.frame, strsplit(
    as.character(dfL$ind), "(?=\\d)", perl=TRUE)),
  c("var", "time")))
dfL$X <- paste(dfL$var, dfL$values, sep ="_")
dfA <- aggregate(values ~ Code + Cond + X, dfL, length)
reshape(dfA, direction = "wide", idvar=c("Code", "Cond"), timevar="X")