首页 > 解决方案 > 如果存在,则将数据框中的列的结构转换为字符,否则不要担心

问题描述

我正在创建一个函数,该函数会将几个逗号分隔的文件读入 R,然后再对它们进行变异以添加几列,然后再次将其导出以在另一个模型中使用这些文件。在某些文件中存在一个包含数字的特定字段,但模型将其表示为字符串(周围带有“”)。自然,R 显然将其读取为数字字段,因此如果列名存在,我想将其转换为字符。

我尝试过的函数中的代码如下:

with(df, if("name of column" %in% colnames(df)) as.character)

不幸的是,这不起作用。先感谢您!

Ps 我的脚本中有进一步的代码,它将在所有字符字段中添加“”,因此获取这些不是问题,只是实际转换为字符字段。

标签: r

解决方案


我们可以编写一个简单的名称检查器函数:

    check_names<- function(df, col_name = "Species"){
  if(col_name %in% names(df)){
    df[[col_name]]<- as.character(df[[col_name]])

  }

  df
}
str(check_names(iris,"Species"))

编辑

下面修改后的函数将适用于多个列:

check_names<- function(df, col_names = NULL){
  if(all(col_names %in% names(df))){

    df[,col_names]<- sapply(df[,col_names],as.character)

  }

  df
}

使用上述结果:


str(check_names(iris,c("Species","Sepal.Length")))
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: chr  "5.1" "4.9" "4.7" "4.6" ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : chr  "setosa" "setosa" "setosa" "setosa" ...

原始结果:

data.frame':    150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : chr  "setosa" "setosa" "setosa" "setosa" .


# non existent names
str(check_names(iris,"nope"))
'data.frame':   150 obs. of  5 variables:
 $ Sepal.Length: num  5.1 4.9 4.7 4.6 5 5.4 4.6 5 4.4 4.9 ...
 $ Sepal.Width : num  3.5 3 3.2 3.1 3.6 3.9 3.4 3.4 2.9 3.1 ...
 $ Petal.Length: num  1.4 1.4 1.3 1.5 1.4 1.7 1.4 1.5 1.4 1.5 ...
 $ Petal.Width : num  0.2 0.2 0.2 0.2 0.2 0.4 0.3 0.2 0.2 0.1 ...
 $ Species     : Factor w/ 3 levels "setosa","versicolor",..: 1 1 1 1 1 1 1 1 1 1 ...

推荐阅读