※ 引述《celestialgod (攸蓝)》之铭言:
: ※ 引述《gn01349943 (flying)》之铭言:
: : [软件熟悉度]:
: : 使用者(已经有用R 做过不少作品)
: : [问题叙述]:
: : 请简略描述你所要做的事情,或是这个程式的目的
: : 有一个data.table如以下格式,
: : x b V3 V4
: : 1 1 2 1 1
: : 2 2 3
: : 3 3 4
: : 4 4 5 4 4
: : 5 5 6 5 5
: : 6 1 2 1 1
: : 我想要变成以下格式,
: : x b V3 V4
: : 1 1 2 1 1
: : 2 2 3
: : 3 3 4
: : 4 4 5 4 4
: : 5 5 6 5 5
: : 6 1 2 1 1
: : 目前我可以用一个循环把它完成,如以下,
: : 但是我想问有没有使用data.table语言的方法?
: : 因为实际资料有达到十万多条row。
: : len <- ncol(dd)
: : dd <- as.data.frame(dd)
: : for (x in 1:nrow(dd)) {
: : idx <- sum(dd[x,]!="")
: : if(idx != len) {
: : dd[x,((len-idx+1):len)] <- dd[x,1:idx]
: : dd[x,1:(len-idx)] <- ""
: : }
: : }
: 如果是我 我会考虑下面的做法,供您参考:
: library(data.table)
: library(plyr)
: library(dplyr)
: library(magrittr)
: dt = fread("
: x,b,V3,V4
: 1, 2, 1, 1
: 2, 3,,
: 3, 4,,
: 4, 5, 4, 4
: 5, 6, 5, 5
: 1, 2, 1, 1")
: dt
: # x b V3 V4
: # 1: 1 2 1 1
: # 2: 2 3 NA NA
: # 3: 3 4 NA NA
: # 4: 4 5 4 4
: # 5: 5 6 5 5
: # 6: 1 2 1 1
: PS:如果不是NA,下面which, filter条件可以自己改成抓得出来的值
: 像是若是"",就用V4=="",而非is.na(V4)
: dt[which(is.na(dt$V4))] = filter(dt, is.na(V4)) %>% select(x, b) %>%
: cbind(matrix(rep(NA_integer_ ,ncol(.)*nrow(.)), nrow(.)), .)
: PS2: 如果是"",NA_integer_要改成NA_character_,这样column的class才对
: dt
: # x b V3 V4
: # 1: 1 2 1 1
: # 2: NA NA 2 3
: # 3: NA NA 3 4
: # 4: 4 5 4 4
: # 5: 5 6 5 5
: # 6: 1 2 1 1
感谢回复!
但我题目可能说的不够清楚,实际情况是有值项结束不是固定的,
这样就可能就需要再加个判断有多少数量在each row,
例如,资料可能长这样子,
(dd <- data.table(x=1:6,b=c(2,'',4,5,6,7),c(1,'','',4,5,6),c(1,'','',4,5,''),c('','','',4,5,'')))
x b V3 V4 V5
1: 1 2 1 1
2: 2
3: 3 4
4: 4 5 4 4 4
5: 5 6 5 5 5
6: 6 7 6
想要变成这样的格式,
x b V3 V4 V5
1 1 2 1 1
2 2
3 3 4
4 4 5 4 4 4
5 5 6 5 5 5
6 6 7 6
自问自答一下,睡觉前突然想到了!
dd1 <- data.table(t(dd))
len <- nrow(dd1)
fun <-function(x){
idx <- len-length(which(x!=''))
if (idx !=0) {
res <- rbind(array(rep('',idx),c(idx,1)), as.matrix(x[which(x!='')],ncol=1))
} else {
res <- as.matrix(x[which(x!='')],ncol=1)
}
res
}
res <- dd1[,lapply(.SD,fun)]
res <- data.table(t(res))
不知道是否还有更快速的写法?
谢谢。