我正在努力找到用于以下列方式转换数据的正确功能,并且想知道是否有人可以给我任何建议。我不确定用于我的搜索的正确查询,所以如果这有一个非常明显的解决方案我会道歉。这不是从宽格式到长格式的转换,但它有点类似......但是,我无法使用融合或转换找到解决方案。
$name $total $numcorrect
--------------------------
bob 2 2
bob 1 0
mary 4 3
...
成为
$name $n $correct
-------------------------
bob 1 TRUE
bob 2 TRUE
bob 3 FALSE
mary 1 TRUE
mary 2 TRUE
mary 3 TRUE
mary 4 FALSE
在排序中,对于每个$ name,我想将总数中的数字转换为二项式形式。例如。对于Bob的第一行,我想要2个为TRUE的新行,而对于Bob的第二行,我想要一行为FALSE。
答案 0 :(得分:1)
你也可以添加一个总不正确的列,然后使用apply在cbind中重复一遍。
df$inc=df$tot-df$cor
data.frame(do.call(rbind, apply(df, 1, function(x) cbind(name=rep(x[1],x[2]),n=1:x[2],correct=c(rep(TRUE,x[3]), rep(FALSE,x[4]))))))
name n correct
1 bob 1 TRUE
2 bob 2 TRUE
3 bob 1 FALSE
4 mary 1 TRUE
5 mary 2 TRUE
6 mary 3 TRUE
7 mary 4 FALSE
答案 1 :(得分:0)
# try this
df <- data.frame(
name = c('bob', 'bob', 'mary'),
total = c(2, 1, 4),
numcorrect = c(2, 0, 3),
stringsAsFactors = F
)
df.new <- data.frame(
name = rep(df$name, df$total),
correct = rep(rep(c(T, F), nrow(df)), c(rbind(df$numcorrect, df$total - df$numcorrect))),
stringsAsFactors = F
)
# > df.new
# name correct
# 1 bob TRUE
# 2 bob TRUE
# 3 bob FALSE
# 4 mary TRUE
# 5 mary TRUE
# 6 mary TRUE
# 7 mary FALSE
# if bob 1 0 was the first row:
df <- data.frame(
name = c('bob', 'bob', 'mary'),
total = c(1, 2, 4),
numcorrect = c(0, 2, 3),
stringsAsFactors = F
)
df.new <- data.frame(
name = rep(df$name, df$total),
correct = rep(rep(c(T, F), nrow(df)), c(rbind(df$numcorrect, df$total - df$numcorrect))),
stringsAsFactors = F
)
# > df.new
# name correct
# 1 bob FALSE
# 2 bob TRUE
# 3 bob TRUE
# 4 mary TRUE
# 5 mary TRUE
# 6 mary TRUE
# 7 mary FALSE