目标是在包含“ XX”或“ YY”的列上使用parse_number()
(消除所有“逗号”)
# DT
DT <- data.table(C1 = c("12","14","94"),XX_C2 =
c("12,1","14,0","94,1"),XX_C3 = c("52,33","44,9","194,1"),C4 =
c("124","1","9"),ZZ_C5 = c("1132,3","1442,0","914,2"),ZZ_C5 =
c("1532,3","1742,9","94,1"))
我有如下方法:(有效)
DT <- DT %>%
mutate_at(vars(grep("XX|YY",names(.), value = TRUE)), funs(parse_number))
对于大数据,如何以data.table的方式实现此目的,因为library(dplyr) %>%
非常慢。
DT[,parse_number(.SD),.SDcols = list(grep("XX|YY",colnames(DT),value = TRUE))]
获取错误
DT[,grep("XX"|YY",colnames(DT),value = TRUE),with = FALSE]
可以动态选择列,但不知道如何将:=
与parse_number(x)
应用于隐式列
答案 0 :(得分:3)
您可以融化数据以提供一个value
列,然后可以通过您的parse_number()
函数进行传递。
## defining a 'parse_number' function
parse_number <- function(x) {
as.numeric(gsub(pattern = ",",".",x))
}
cols <- names(DT)[grepl("^C", names(DT))]
dt <- melt(DT, id.vars = cols)[, value := parse_number(value)][]
dt
# C1 C4 variable value
# 1: 12 124 XX_C2 12.10
# 2: 14 1 XX_C2 14.00
# 3: 94 9 XX_C2 94.10
# 4: 12 124 XX_C3 52.33
# 5: 14 1 XX_C3 44.90
# 6: 94 9 XX_C3 194.10
# 7: 12 124 ZZ_C5 1132.30
# 8: 14 1 ZZ_C5 1442.00
# 9: 94 9 ZZ_C5 914.20
# 10: 12 124 ZZ_C5 1532.30
# 11: 14 1 ZZ_C5 1742.90
# 12: 94 9 ZZ_C5 94.10
注意:
在原始数据中,您有两列ZZ_C5
-可能需要检查一下。
答案 1 :(得分:3)
如果我们使用parse_number
中的readr
,则在创建具有'XX或'ZZ'的列名称的索引之后,请在.SDcols
中指定,在{{ 1}}(Data.table的子集),用.SD
提取数字,并将输出分配(readr::parse_number
)到同一列
:=
注意:在此示例中,有两列名称相同,即“ ZZ_C5”。不建议使用相同的列名,因为以后可能会出现问题。
library(data.table)
nm1 <- grep("XX|ZZ", names(DT))
DT[ , (nm1) := lapply(.SD, parse_number), .SDcols = nm1]
DT
# C1 XX_C2 XX_C3 C4 ZZ_C5 ZZ_C5
#1: 12 121 5233 124 11323 15323
#2: 14 140 449 1 14420 17429
#3: 94 941 1941 9 9142 941