数据转换 - 基于旧行的多行

时间:2016-12-01 16:24:46

标签: r

我正在努力找到用于以下列方式转换数据的正确功能,并且想知道是否有人可以给我任何建议。我不确定用于我的搜索的正确查询,所以如果这有一个非常明显的解决方案我会道歉。这不是从宽格式到长格式的转换,但它有点类似......但是,我无法使用融合或转换找到解决方案。

$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。

2 个答案:

答案 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