Re: [问题] 有关于资料整理(向右对齐)

楼主: celestialgod (天)   2015-07-12 23:52:47
※ 引述《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

Links booklink

Contact Us: admin [ a t ] ucptt.com