将一个列拆分成几个并将它们转换为r中的一行

时间:2014-09-23 15:21:54

标签: r data.table sqldf subset

PLZ帮助我如何编码以从数据中得到结果。我有一个包含超过1000000行的数据框,其中包含非连续的NA。我想将TA_DAY列拆分成这样:" 1~5,5~10 ....继续......结束"直到最后一排,并将它们组合成下面的那个...有没有人有想法或提示?哪个功能?我应该用它吗?非常感谢你G-day ......

for(i in 0:161){
  aa[i+1]<-melt(dt4$WSmax[1:12+(12*i)])
}

list <- unlist(aa, recursive = FALSE)
df <- do.call("rbind", aa)




 ID YEAR PRICE                                    this is the one that i need 
    --------------                                  -------------------                          
    A  2001 19.45                                   19.45 98.23 12.33
    A  2003 98.23                                    NA   77.4  32.33
    B  2009 12.33               =>           
    C  2001  NA
    C  2004 77.4
    D  1999 32.33
    .
    .

2 个答案:

答案 0 :(得分:1)

 sapply(1:(nrow(dat)-3), function(i) dat$PRICE[c(i, i+3)])
 #      [,1]  [,2]  [,3]
 #[1,] 19.45 98.23 12.33
 #[2,]    NA 77.40 32.33

数据

dat <- structure(list(ID = c("A", "A", "B", "C", "C", "D"), YEAR = c(2001L, 
2003L, 2009L, 2001L, 2004L, 1999L), PRICE = c(19.45, 98.23, 12.33, 
NA, 77.4, 32.33)), .Names = c("ID", "YEAR", "PRICE"), class = "data.frame", row.names = c(NA, 
-6L))

答案 1 :(得分:0)

由于描述与样本输出似乎不一致,我对所需内容并不完全清楚。我假设除了PRICE之外的所有列都可以忽略,我们希望PRICE的每个值以及前面的值3位置,因为它给出了示例输出。在那种情况下,来自动物园的rollapply可以做到。这有两种不同的方式:

library(zoo)

t(rollapply(dat$PRICE, 4, function(x) c(x[1], x[4])))
##       [,1]  [,2]  [,3]
## [1,] 19.45 98.23 12.33
## [2,]    NA 77.40 32.33

使用rollapply执行此操作的另一种方法:

t(rollapply(dat$PRICE, list(c(0, 3)), identity))
##       [,1]  [,2]  [,3]
## [1,] 19.45 98.23 12.33
## [2,]    NA 77.40 32.33