首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用for循环从dataset获取多个列

使用for循环从dataset获取多个列
EN

Stack Overflow用户
提问于 2022-10-13 20:00:50
回答 1查看 19关注 0票数 0

我对for循环缺乏经验,并试图在R中为来自df数据集的几列编写for循环。我感兴趣的每一列都有从1到15或NA的值。“名称”是这些列的名称列表:

代码语言:javascript
复制
>names

[1] "score"  "rate"   "asset"     "capital"  "earning"  "ast" "liquid"  "profit"  "assesment" "factor" 

我想用"1-5“、"6-10”、"11-15“等组替换它们的值。我尝试了以下代码:

代码语言:javascript
复制
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)))))
    }

但有个错误:

代码语言:javascript
复制
Error: Column i must be length 2511 (the number of rows) or one, not 0

请您帮助/建议如何编写这样的for循环并解决这个问题。

EN

回答 1

Stack Overflow用户

发布于 2022-10-13 20:03:26

如果我们想在tidyverse中这样做,可以使用across循环列,使用case_when而不是嵌套的ifelse

代码语言:javascript
复制
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")))

使用cutfindInterval可以更容易地完成这些任务。

代码语言:javascript
复制
df <- df %>%
      mutate(across(all_of(names), cut, breaks = c(-Inf, 1, 6, 11, 15, Inf)))

for循环中,存在多个问题,即i=创建一个名为i的列,而不是i中的值。此外,如果存在,$i将提取i列,而不是该列的值,使用[[ (在这里,这两种方法都不需要,因为我们可以转换为symbol并计算(!!),或者从.data提取带有[[的列。

代码语言:javascript
复制
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)))))
    }
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74061176

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档