首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >R中不同变量/cols的分类值频率?

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

Stack Overflow用户
提问于 2013-11-12 14:06:49
回答 2查看 415关注 0票数 0

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

代码语言:javascript
复制
   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的. for each参与者(行),但是有变量子集(bf-items and bm-items)。最简单的方法是什么?

最终应该是这样的:

代码语言:javascript
复制
   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 ...
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-12 16:47:22

如果我正确理解了您的问题,您可能只需要从“melt”包中探索reshape2和dcast。使用@zx8754的示例数据,尝试以下内容:

代码语言:javascript
复制
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

从这里,您可以始终将相关的mergecbind列放在一起,以获得完整的data.frame

更新

为了避免被看作是"reshape2“的粉丝,这里有一个基本的R方法。我希望它也能说明为什么我选择"reshape2“路线,在这种情况下:

代码语言:javascript
复制
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")
票数 1
EN

Stack Overflow用户

发布于 2013-11-12 14:15:55

试试这个:

代码语言:javascript
复制
#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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19931326

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档