是否可以根据当前类更改数据框中多列的类?

Emi*_*ily 1 for-loop r class apply multiple-columns

我有一个包含 500 多个列的大型数据框,其中包含各种顺序的各种类。示例数据:

col1    col2    col3    col4    col5    col6
 2      red      1.2      5       5      5.7
 4     banana    2.3      0       6      5.2
 8      two      2.4      9       8      5.4
 2     first     1.6      7       9      5.9
Run Code Online (Sandbox Code Playgroud)

我正在尝试根据列当前的类别来更改列的类别。例如,我也想将当前属于“整数”类的每个列更改为“数字”类,但保留当前属于“字符”类的所有列不变。这可能吗?

我尝试使用 for 循环,但是当我以这种方式设置它时,它将列类读取为“data.frame”而不是“numeric”。

for(i in 1:ncol(df)){
  ifelse(class(df[,i])=="integer",
         as.numeric(df[,i]),NA)
}
Run Code Online (Sandbox Code Playgroud)

我还尝试使用 apply 但无法弄清楚如何正确编码条件或让它仅循环遍历我的一些列,而不创建一个向量专门命名具有我想要更改的类类型的所有列。

cols <- colnames(df[,which(is.Class("integer"))])
df[,cols] = apply(df[,cols], 2, function(x) as.numeric(x));
Run Code Online (Sandbox Code Playgroud)

有谁知道是否可以做到这一点,如果可以,怎么做?谢谢你!

Gre*_*gor 5

ifelse是为向量而设计的,要求结果的长度(或形状)与输入的长度(或形状)相同。当您有一个向量作为输入并希望修改后的向量作为输出时,它非常有用。

在本例中,您想要更改列的类,因此我们不想if(){}else{}更改ifelse()

此外,使用is.class函数(如is.integeris.numeric)比class ==检查类要安全得多——这是因为一个对象可以有多个类。

最后,将数据框的单个列称为 比 更安全data[[col]]一些data[, col]。这[[确保我们得到单个列作为向量,而不是单列数据框。(“tibbles”和其他类似 data.frame 的对象与 具有不同的行为data[, col],但是data[[col]]安全的。)

for循环进行这些修复:

for(i in 1:ncol(df)) {
  if(is.integer(df[[i]])) {
    df[[i]] <- as.numeric(df[[i]])
  }
}
Run Code Online (Sandbox Code Playgroud)

我们lapply也可以这样做:

int_cols <- sapply(df, is.integer)
df[int_cols] <- lapply(df[int_cols], as.numeric)
Run Code Online (Sandbox Code Playgroud)