次のデータセットを検討してください。
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の回答でdata.table
言及されているように)、これにさらに操作を連鎖させたいため、解決策を探しています。
by
引数で分割する必要のない変数を手動で指定せずに、どうすればそれを防ぐことができますか?