【发布时间】:2020-04-16 20:27:07
【问题描述】:
我已经看到here 给出的答案,但我想知道在我的情况下,BASE R 中是否有一种有效的方法可以将我的 input data.frame 更改为我想要的 output data.frame 如下图?
input <- data.frame(id = c(1,3,6), school = LETTERS[1:3], read_1 = c(20,22,24),
read_1_sp = c(T,F,T), read_2 =c(45,47,49),read_2_sp = c(F,F,F),
math_1 =c(20,22,NA), math_1_sp = c(T,F,NA), math_2 = c(NA,35,37),
math_2_sp =c(NA,F,F))
output <- data.frame(id = c(rep(1,3),rep(3,4), rep(6, 3)),school = c(rep("A",3),rep("B",4), rep("C", 3)),
subject = c("read","read","math","read","read","math", "math","read","read","math"),
no.= c(1,2,1,1,2,1,2,1,2,2), score = c(20,45,20,22,47,22,35,24,49,37),
sp = c(T,F,T,T,F,T,T,T,F,T))
【问题讨论】:
-
你试过
stats::reshape吗?它不是最直观的使用方式,但它可以重塑你所寻求的。 -
由于您正在尝试缩小几列,我怀疑这将是对
reshape的几次独立调用,然后merge将它们放在一起。 -
IMO,这是
tidyr::pivot_longer的强大动力......虽然我很欣赏你坚持使用基础 R 的动力,但便利功能如此......便利是有原因的 :-)跨度> -
您是否考虑过
sqldf或其他一些基于sql 的解决方案?这与您的 base-R 约束相反,但如果您已经在工作流程的其他地方使用了sqldf、DBI、RSQLite或其他一些 DBMS 之一,则可以利用它。