【个人自用,叙述表达可能不清 存在理解错误可能】
以下均为本人做作业时遇到的各种问题,感谢StackOverflow与男友的倾情相助。各种弱智问题尚在补全中。
1. 合并list中多个的elements
数据集dt如下:
cyl | gear |
---|---|
6 | 4 |
6 | 4 |
6 | 3 |
6 | 3 |
4 | 4 |
8 | 3 |
8 | 2 |
需要根据某列数值分类,合并其他列出现过的数据。
此处举例为,统计每类cyl分别出现过哪些gear类型,希望达成的结果如下:
cyl | gearsL |
---|---|
6 | 4, 3 |
4 | 4 |
8 | 3, 2 |
dt <- unique(dt)
dt[, gearsL := paste0(gear, collapse=", "), by = cyl]
dt$gear <- NULL
或者更为简洁的,将gearsL赋值为list类型:
dt[, gearsL := .(list(unique(gear))), by = cyl]
使用function “rbindlist”
usage:
rbindlist(list, use.names=“check”, fill=FALSE, idcol=NULL)
dt.country <- c("Sweden", "Netherlands", "Germany", "France",
"Italy", "Spain", "United Kingdom", "Poland")
# use rbindlist
dt.covid19 <- rbindlist(json.convid19[dt.country],
use.names = T, idcol = "country")
# use loops
dt.covid19 <- data.table()
for (country in dt.country){
dt <- json.convid19[[country]]
dt$country <- country
dt.covid19 <- rbind(dt, dt.covid19)
rm(dt)
}
2. 使用.SD在datatable内选择行
.SD is a data.table containing the Subset of x’s Data for each group, excluding any columns used in by (or keyby).
DT[, .SD, .SDcols=x:y] # select columns 'x' and 'y'
DT[, .SD[1]] # first row of all columns
DT[, .SD[1], by=x] # first row of 'y' and 'v' for each group in 'x'
DT[, c(.N, lapply(.SD, sum)), by=x] # get rows *and* sum columns 'v' and 'y' by group
# 不同实现方式的同一结果
dt.email <- as.data.table(sapply(dt.email, tolower)) # apply后转化为datatable
dt.enron.email <- dt.email[, lapply(.SD, tolower)] # 在datatable内完成
根据datatable中的一列数据分组并运算,将结果添加为新的一列
譬如用cyl分类,查看各cyl下gear的平均数值。数据集dt是1中数据集:
dt[, mean := lapply(.SD, mean), by = cyl, .SDcols = "gear"]
返回结果如下:
cyl | gear | mean |
---|---|---|
6 | 4 | 3.5 |
6 | 4 | 3.5 |
4 | 4 | 4.0 |
6 | 3 | 3.5 |
8 | 3 | 3.0 |
6 | 3 | 3.5 |
3. 判断datatable中某列是否包含特定文字
# 检查file.name列中是否包含单词spam, 返回T/F
dt.email[, "spam" := grepl("spam", file.name)]
4. 计算给定列和其它各列差值
names <- colnames(dt)[2:11]
for (y in names){
gn <- paste0("X7", ":", y)
dt[, (gn) := mapply(function(x) dt$X7-.SD[[y]], y, SIMPLIFY = F)]
}