簡體   English   中英

R DataTable 重新編碼許多變量

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM