【问题标题】:Using `apply` to modify string by `tolower`使用 `apply` 通过 `tolower` 修改字符串
【发布时间】:2026-01-30 12:30:01
【问题描述】:

我有一个带有一些字符变量和数字/整数变量的data.table,我想识别一个字符类型的变量,然后运行tolower 函数来修改大小写。这是我正在做的,但它似乎没有完成类型检查以仅对字符变量进行操作:

set.seed(426)
dt <- data.table(a = runif(5), b = sample(LETTERS, 5))

dt
           a b
1: 0.8472276 Y
2: 0.1567767 J
3: 0.9817384 L
4: 0.2250681 S
5: 0.5994389 H

sapply(dt, class)
        a           b 
"numeric" "character"

dt2 <- as.data.table(sapply(dt, function(n){
    if(class(n) == "character"){
            n <- tolower(n)
    } else{
            n 
    }
}))

dt2
                   a b
1: 0.847227579215541 y
2: 0.156776716466993 j
3: 0.981738423462957 l
4: 0.225068145431578 s
5: 0.599438918055966 h

sapply(dt2, class)
          a           b 
"character" "character" 

我是申请家庭的新手,感谢任何见解

【问题讨论】:

  • ?sapply 尝试返回一个矩阵,并且您不能在矩阵中有多个类型,因此转换为字符。所以试试lapply
  • * 我认为* 你可以这样做 dt[, lapply(.SD, function(x) if(is.character(x)) tolower(x) else x)] ,虽然很可能是更好的 data.table 方式来做到这一点
  • @GabrielFGeislerMesevage 我需要转换具有多列的多个数据表,我的方法的目的是避免必须通过变量/列名直接在整个数据集上强制命令
  • @user20650 你的第一条评论是在 .. 上准确地替换 sapplylapply 函数 - 如果你想添加它作为答案,我会标记为这样
  • @user20650 cols = names(dt)[sapply(dt, is.character)]; dt[, (cols) := lapply(.SD, tolower), .SDcols=cols] 我猜。

标签: r string data.table sapply


【解决方案1】:

sapply 在尝试返回矩阵时将所有变量强制转换为字符。由于矩阵中不能有多个变量类型,因此所有变量类型都转换为字符。为避免这种情况,您可以使用lapply

对于更多的 data.table 方法来解决这个问题,由 Frank 提供,您可以这样做

# Find character columns
cols = names(dt)[sapply(dt, is.character)] # or which(sapply(dt, is.character)) 
# set these columns to lower
dt[, (cols) := lapply(.SD, tolower), .SDcols=cols]

或者这个

dt[, lapply(.SD, function(x) if(is.character(x)) tolower(x) else x)]

【讨论】: