【发布时间】:2015-07-22 16:08:36
【问题描述】:
考虑以下数据集:
dt <- structure(list(lllocatie = structure(c(1L, 6L, 2L, 4L, 3L), .Label = c("Assen", "Oosterwijtwerd", "Startenhuizen", "t-Zandt", "Tjuchem", "Winneweer"), class = "factor"),
lat = c(52.992, 53.32, 53.336, 53.363, 53.368),
lon = c(6.548, 6.74, 6.808, 6.765, 6.675),
mag.cat = c(3L, 2L, 1L, 2L, 2L),
places = structure(c(2L, 4L, 5L, 6L, 3L), .Label = c("", "Amen,Assen,Deurze,Ekehaar,Eleveld,Geelbroek,Taarlo,Ubbena", "Eppenhuizen,Garsthuizen,Huizinge,Kantens,Middelstum,Oldenzijl,Rottum,Startenhuizen,Toornwerd,Westeremden,Zandeweer", "Loppersum,Winneweer", "Oosterwijtwerd", "t-Zandt,Zeerijp"), class = "factor")),
.Names = c("lllocatie", "lat", "lon", "mag.cat", "places"),
class = c("data.table", "data.frame"),
row.names = c(NA, -5L))
当我想将最后一列中的字符串拆分为单独的行时,我使用(data.table 版本 1.9.5+):
dt.new <- dt[, lapply(.SD, function(x) unlist(tstrsplit(x, ",", fixed=TRUE))), by=list(lllocatie,lat,lon,mag.cat)]
但是,当我使用:
dt.new2 <- dt[, lapply(.SD, function(x) unlist(tstrsplit(x, ",", fixed=TRUE))), by=lllocatie]
我得到了相同的结果,除了所有列都被强制为字符变量。问题在于,对于小型数据集,在 by 参数中指定不必拆分的变量并不是一个大问题,但对于具有许多列/变量的数据集来说,这是一个大问题。我知道可以使用splitstackshape 包(正如@ColonelBeauvel in his answer 提到的那样)来执行此操作,但我正在寻找data.table 解决方案,因为我想将更多操作链接到此。
如果不手动指定不必在 by 参数中拆分的变量,如何防止这种情况发生?
【问题讨论】:
-
对
tstrsplit()使用type.convert=TRUE参数。 -
如果是指定很多变量的问题,你能用
setdiff(names(dt),badcol)之类的东西来构造你的by和.SD吗? -
@Arun 有效(听起来像是一个答案:-))
标签: r data.table splitstackshape