我对for循环缺乏经验,并试图在R中为来自df数据集的几列编写for循环。我感兴趣的每一列都有从1到15或NA的值。“名称”是这些列的名称列表:
>names
[1] "score" "rate" "asset" "capital" "earning" "ast" "liquid" "profit" "assesment" "factor" 我想用"1-5“、"6-10”、"11-15“等组替换它们的值。我尝试了以下代码:
for (i in names){
df <- mutate(df, i =
ifelse(df$i >= 1 & df$i <= 5 , "1-5",
ifelse(df$i >= 6 & df$i <= 10, "6-10",
ifelse(df$i >= 11 & df$i <= 15, "11-15",NA)))))
}但有个错误:
Error: Column i must be length 2511 (the number of rows) or one, not 0请您帮助/建议如何编写这样的for循环并解决这个问题。
发布于 2022-10-13 20:03:26
如果我们想在tidyverse中这样做,可以使用across循环列,使用case_when而不是嵌套的ifelse。
library(dplyr)
df <- df %>%
mutate(across(all_of(names), ~ case_when(.x >=1 & .x <=5 ~ "1-5",
.x >= 6 & .x <= 10 ~ "6-10",
.x >= 11 & .x <= 15 ~ "11-15")))使用cut或findInterval可以更容易地完成这些任务。
df <- df %>%
mutate(across(all_of(names), cut, breaks = c(-Inf, 1, 6, 11, 15, Inf)))在for循环中,存在多个问题,即i=创建一个名为i的列,而不是i中的值。此外,如果存在,$i将提取i列,而不是该列的值,使用[[ (在这里,这两种方法都不需要,因为我们可以转换为symbol并计算(!!),或者从.data提取带有[[的列。
for (i in names){
df <- mutate(df, !!i :=
ifelse(.data[[i]] >= 1 & .data[[i]] <= 5 , "1-5",
ifelse(.data[[i]] >= 6 & .data[[i]] <= 10, "6-10",
ifelse(.data[[i]] >= 11 &
.data[[i]] <= 15, "11-15",NA)))))
}https://stackoverflow.com/questions/74061176
复制相似问题