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)
有谁知道是否可以做到这一点,如果可以,怎么做?谢谢你!
ifelse是为向量而设计的,要求结果的长度(或形状)与输入的长度(或形状)相同。当您有一个向量作为输入并希望修改后的向量作为输出时,它非常有用。
在本例中,您想要更改列的类,因此我们不想if(){}else{}更改ifelse()。
此外,使用is.class函数(如is.integer、is.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)