【发布时间】:2018-02-21 18:57:42
【问题描述】:
尝试使用以下方法对数据框中的列执行 lapply:
all <- lapply(all, function(x) as.numeric(as.character(x)))
这样做是为了将数据框的默认值从 chr 更改为数字,因为从 excel 导入时的默认值。
有没有办法可以在除特定列之外的所有列上执行此操作? (在这种情况下,请跳过一列并应用到其余列)谢谢。
【问题讨论】:
尝试使用以下方法对数据框中的列执行 lapply:
all <- lapply(all, function(x) as.numeric(as.character(x)))
这样做是为了将数据框的默认值从 chr 更改为数字,因为从 excel 导入时的默认值。
有没有办法可以在除特定列之外的所有列上执行此操作? (在这种情况下,请跳过一列并应用到其余列)谢谢。
【问题讨论】:
要跳过单个列,您可以执行以下操作:
all[,-1] <- lapply(all[,-1], function(x) as.numeric(as.character(x)))
【讨论】:
向量columns.of.interest 可以是表示数据框中列位置的数值,也可以是由列名组成的字符串。我使用sapply() 返回向量。
# store columns of interest
columns.of.interest <- 2:ncol( all )
# filter by columns of interest
all[ , columns.of.interest ] <- sapply( X = all[ , columns.of.interest ]
, FUN = function(x) as.numeric(as.character(x)))
【讨论】:
你为什么不试试apply,你可以这样做:
col <- c(<specific_columns>)
x[,col] <- apply(x[,col],2,as.numeric)
查看 R 控制台中的 ?apply 了解更多信息。
【讨论】:
您可以使用基础 R 进行原地修改:
df <- data.frame(a= as.character(1:5),
b = as.character(6:10),
c = factor(letters[1:5]),
stringsAsFactors = FALSE)
# str(df)
# 'data.frame': 5 obs. of 3 variables:
# $ a: chr "1" "2" "3" "4" ...
# $ b: chr "6" "7" "8" "9" ...
# $ c: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
df[-3] <- lapply(df[-3], function(x) as.numeric(as.character(x)))
str(df)
# 'data.frame': 5 obs. of 3 variables:
# $ a: num 1 2 3 4 5
# $ b: num 6 7 8 9 10
# $ c: Factor w/ 5 levels "a","b","c","d",..: 1 2 3 4 5
或使用库purrr 和使用modify_at 或modify_if 具有相同的效果
df2 <- purrr::modify_at(df,.at = c("a","b"),~as.numeric(as.character(.)))
df3 <- purrr::modify_if(df,is.character,~as.numeric(as.character(.)))
【讨论】: