[英]R DataTable Recode Many Variables
data=data.frame("cat" = sample(c('a','b'), 100, r=T),
"dog" = sample(c('a','b'), 100, r=T),
"bark" = sample(c(1:1000), 100, r=T),
"fox" = sample(c('a','b'), 100, r=T))
library(data.table)
setDT(data)
是否有可能將 cat、dog、fox 中的“a”替換為 -9,將“b”替換為 9? 我希望同時執行此操作並使用 data.table 中的列名
如果這些是字符列,則set
一個選項
for(nm1 in c('cat', 'dog', 'fox')) {
set(data, i = which(data[[nm1]] == 'a'), j= nm1, value = -9)
set(data, i = which(data[[nm1]] == 'b'), j= nm1, value = 9)
}
或者另一種選擇是
nm1 <- c('cat', 'dog', 'fox')
data[, (nm1) := lapply(.SD, function(x)
setNames(c(-9, 9), c('a', 'b'))[x]), .SDcols =nm1]
set.seed(24)
data=data.frame("cat" = sample(c('a','b'), 100, replace=TRUE),
"dog" = sample(c('a','b'), 100, replace=TRUE),
"bark" = sample(c(1:1000), 100, replace=TRUE),
"fox" = sample(c('a','b'), 100, replace=TRUE), stringsAsFactors = FALSE)
1)使用 Note 中的設置會轉換所有字符列。
DT[, lapply(.SD, function(x) if (is.character(x)) c(a = 9, b = -9)[x] else x)]
給予:
cat dog bark fox
1: 9 -9 890 -9
2: -9 9 693 -9
3: 9 -9 641 -9
4: -9 -9 995 -9
5: -9 9 656 9
6: 9 -9 709 9
7: -9 9 545 -9
8: -9 9 595 9
9: -9 9 290 9
10: 9 -9 148 9
2)如果您有其他字符列並且只想更改只有 'a' 和 'b' 的那些,那么:
DT[, lapply(.SD, function(x)
if (is.character(x) && all(x %in% c("a", "b"))) c(a = 9, b = -9)[x] else x)]
3) 名稱如果您更喜歡明確指定列名稱,則可以使用此替代方法。 這會將DT
修改為所需的形式。
nms <- c("cat", "dog", "fox")
DT[, c(nms):=lapply(.SD, function(x) c(a = 9, b = -9)[x]), .SDcols = nms]
library(data.table)
set.seed(123)
DT <- data.table("cat" = sample(c('a','b'), 10, TRUE),
"dog" = sample(c('a','b'), 10, TRUE),
"bark" = sample(c(1:1000), 10, TRUE),
"fox" = sample(c('a','b'), 10, TRUE))
另一種選擇是:
cols <- c("cat", "dog", "fox")
DT[, (cols) := {
m <- as.matrix(.SD)
m[m=='a'] <- 9
m[m=='b'] <- -9
as.data.table(m)
}, .SDcols=cols]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.