使用 `apply` 通过 `tolower` 修改字符串
Using `apply` to modify string by `tolower`
我有一个 data.table
和一些字符变量和 numeric/integer 变量,我想识别一个字符类型的变量,然后 运行 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"
我是 apply 家族的新手,欢迎任何见解
您的所有变量都被 sapply
强制转换为字符,因为它试图 return 一个矩阵。由于矩阵中不能有多个变量类型,因此所有变量类型都将转换为字符。为避免这种情况,您可以使用 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)]
我有一个 data.table
和一些字符变量和 numeric/integer 变量,我想识别一个字符类型的变量,然后 运行 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"
我是 apply 家族的新手,欢迎任何见解
您的所有变量都被 sapply
强制转换为字符,因为它试图 return 一个矩阵。由于矩阵中不能有多个变量类型,因此所有变量类型都将转换为字符。为避免这种情况,您可以使用 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)]