※ 引述《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