【问题标题】:Function for converting dataframe column type用于转换数据框列类型的函数
【发布时间】:2012-06-30 23:05:43
【问题描述】:

R 经常以“错误”的格式理解数据框列,或者您只需将列类从因子更改为字符即可对其进行修改。我之前一直在通过以下方式更改列类:

set.seed(1)

df <- data.frame(x = 1:10,
y = rep(1:2, 5),
k = rnorm(10, 5,2),
z = rep(c(2010, 2012, 2011, 2010, 1999), 2),
j = c(rep(c("a", "b", "c"), 3), "d"))

x <- c("y", "z")

for(i in 1:length(x)){
df[,x[i]] <- factor(df[,x[i]])}

然后回到数字:

x <- 1:5

for(i in 1:length(x)){
df[,x[i]] <- as.numeric(as.character(df[,x[i]]))} # Character cannot become numeric

我突然想到,也许有更好的方法来做到这一点。我找到了this question,这几乎正是我所需要的:

convert.magic <- function(obj,types){
out <- lapply(1:length(obj),FUN = function(i){FUN1 <- 
switch(types[i],
character = as.character,
numeric = as.numeric,
factor = as.factor); FUN1(obj[,i])})
names(out) <- colnames(obj)
as.data.frame(out)
}

但是,对于此函数,必须为每一列指定向量类型:

convert.magic(df, rep("factor",5))

convert.magic(df, c("character", "factor"))
# Error in FUN(1:5[[1L]], ...) : could not find function "FUN1"

有人可以帮我重建这个函数,让它与列名和数字一起工作吗?恐怕这对我来说太高级了……

x <- c("y", "z")
convert.magic(df, "character", x)

【问题讨论】:

  • 如果您只是将因子转换为数值,来自?factor:“要将因子 f 转换为近似其原始数值,建议使用 as.numeric(levels(f))[f]并且比 as.numeric(as.character(f)) 稍微高效一些。”这也表明convert.magic 在某些情况下可能会产生意想不到的结果。
  • @BenBarnes 嗯...我不知道。很好的评论,谢谢!

标签: r function type-conversion


【解决方案1】:
df <- data.frame(x = 1:10,
                 y = rep(1:2, 5),
                 k = rnorm(10, 5,2),
                 z = rep(c(2010, 2012, 2011, 2010, 1999), 2),
                 j = c(rep(c("a", "b", "c"), 3), "d"))

convert.magic <- function(obj, type){
  FUN1 <- switch(type,
                 character = as.character,
                 numeric = as.numeric,
                 factor = as.factor)
  out <- lapply(obj, FUN1)
  as.data.frame(out)
}

str(df)
str(convert.magic(df, "character"))
str(convert.magic(df, "factor"))
df[, c("x", "y")] <- convert.magic(df[, c("x", "y")], "factor")

【讨论】:

  • 这会转换整个data.frame。稍作修改更接近我的要求:convert.magic &lt;- function(obj, type, cols){ FUN1 &lt;- switch(type, character = as.character, numeric = as.numeric, factor = as.factor) obj[,cols] &lt;- lapply(obj[,cols], FUN1) as.data.frame(obj) } 如何在此函数中添加 BenBarnes 评论 (as.numeric(levels(f))[f])?
  • @Largh 在switch 语句中不要使用as.numeric,您可能会编写一个简单的包装器来检查其输入是否是一个因素。如果是,就用本的方法,否则就用as.numeric
猜你喜欢
  • 2017-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-12-02
  • 1970-01-01
  • 2021-12-24
相关资源
最近更新 更多