我正在处理在线调查问卷的输出,并且在处理数据时遇到一些问题。这是设置:在两个9点标度上评定了200张图像,总计400种组合。遗憾的是,数据尚未编码为400个变量,值范围为1到9,但对于每个比例 - 图像组合,已编码了9个二进制变量,对于两个图像比例组合看起来像这样:
Part. V1 V2 V3 V4 V5 V6 V7 V8 V9 V10 V11 V12 V13 V14 V15 V16 V17 V18
1 0 0 1 0 0 0 0 0 0 0 1 0 0 0 0 0 0 0
2 0 0 0 0 0 0 1 0 0
3 0 0 1 0 0 0 0 0 0
如您所见,数据集中还有一些N / A值。这是因为所有400种组合,每个参与者只评定一个随机50个。给定400个组合,我们在数据集中总共有3600个变量。我现在想在某种意义上浓缩和重新编码这些值,即R以9为间隔对vars进行计数,然后将二进制1重新编码为1到9的值,具体取决于它在刻度上的位置,然后将所有内容压缩到400个组合变量。最后,看起来应该是这样的:
Part. C1 C2
1 3 2
2 7
3 3
我已经研究了重塑包,但无法确切地想出这样做的方法。
有什么建议吗?
答案 0 :(得分:1)
使用申请家庭功能:
#dummy data
df <- read.table(text = "
Part.,V1,V2,V3,V4,V5,V6,V7,V8,V9,V10,V11,V12,V13,V14,V15,V16,V17,V18
1,0,0,1,0,0,0,0,0,0,0,1,0,0,0,0,0,0,0
2,0,0,0,0,0,0,1,0,0,,,,,,,,,
3,,,,,,,,,,0,0,1,0,0,0,0,0,0
", header = TRUE, sep = ",")
# result
# cbind - column bind, put columns side by side
cbind(
# First column is the "Part." column
df[, "Part.", drop = FALSE],
# other columns are coming from below code
# sapply returns matrix, converting it to data.frame so we can use cbind.
as.data.frame(
# get data column index 9 columns each, first 2 to 9, then 10 to 18, etc.
sapply(seq(2, ncol(df), 9), function(i)
# for each 9 columns check at which position it is equal to 1,
# using which() function
apply(df[, i:(i + 8)], 1, function(j) which(j == 1)))
)
)
#output
# Part. V1 V2
# 1 1 3 2
# 2 2 7
# 3 3 3
答案 1 :(得分:0)
这是一个小例子的解决方案。我只做了2个可能的结果。因此对于pic 1,v1 = 1,对于pic 1,v2 = 2,对于pic 2,v3 = 1。如果您有9种可能的结果,则必须将id <- rep(1:2, each = 2)
更改为id <- rep(1:n, each = 9)
,其中n是图片总数。同时将final <- matrix(nrow = nrow(dat), ncol = ncol(dat)/2)
中的2更改为9.
我希望有所帮助。
dat <- data.frame(v1 = c(NA,0,1,0), v2 = c(NA,1,0,1), v3 = c(0,1,NA,0), v4 = c(1,0,NA,1))
id <- rep(1:2, each = 2)
final <- matrix(nrow = nrow(dat), ncol = ncol(dat)/2)
for (i in unique(id)){
wdat <- dat[ ,which(id == i)]
for (j in 1:nrow(wdat)){
if(is.na(wdat[j,1] )) {
final[j,i] <- NA
} else {
final[j,i] <- which(wdat[j, ] == 1)
}
}
}
我的例子的输入和输出:
> dat
v1 v2 v3 v4
1 NA NA 0 1
2 0 1 1 0
3 1 0 NA NA
4 0 1 0 1
> final
[,1] [,2]
[1,] NA 2
[2,] 2 1
[3,] 1 NA
[4,] 2 2