首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何创建一个函数,将列值按名称条件更改为R中的olher变量?

如何创建一个函数,将列值按名称条件更改为R中的olher变量?
EN

Stack Overflow用户
提问于 2022-08-02 18:16:41
回答 2查看 55关注 0票数 0

我正在尝试创建一个代码,它使用另一个变量的值来只变异几个列。我在举一个可重复性的例子。

代码语言:javascript
复制
Name <- c("Jon", "Bill", "Maria", "Ben", "Tina")
Age <- c(7, 12, 19, 18, 30)
Age_Kid_17 <- NA
Age_Kid_18 <- NA
Age_Kid_20 <- NA


df <- data.frame(Name, Age,Age_Kid_17,Age_Kid_18,Age_Kid_20)

我希望根据列“年龄”的值来更改列的值,并使用该值来确定要更改的列。下面的循环确实有效,但在我正在处理的情况下需要花费太长时间。

代码语言:javascript
复制
for(i in 1:nrow(df)){
  age_ <- df[i,'Age']
  
  if(age_>21){
    next
  }
  if(age_<17){
    for (a in 17:20){
    df[i,paste0('Age_Kid_',a)] <- 0
    }
  }else{
    for (a in age_:20){
      df[i,paste0('Age_Kid_',a)] <- 0} 
    }
}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-08-02 18:33:28

汤姆的回答是个不错的选择。您也可以在不使用pivot的情况下按以下方式执行此操作。另外,请注意,您的循环代码创建了一个名为"Age_Kid_19“的列,该列在输入数据中不存在。这是故意的吗?

在这里使用rowwise()并不是绝对必要的,但它将确保dplyr单独处理每一行,就像循环代码一样,如果这与实际数据相关的话。

代码语言:javascript
复制
library(tidyverse)

df %>% 
  rowwise() %>% 
  mutate(across(starts_with('Age_Kid'), ~ifelse(Age > parse_number(cur_column()), NA, 0)))

  Name    Age Age_Kid_17 Age_Kid_18 Age_Kid_20
  <chr> <dbl>      <dbl>      <dbl>      <dbl>
1 Jon       7          0          0          0
2 Bill     12          0          0          0
3 Maria    19         NA         NA          0
4 Ben      18         NA          0          0
5 Tina     30         NA         NA         NA
票数 2
EN

Stack Overflow用户

发布于 2022-08-02 18:27:04

这就是你要找的吗?

代码语言:javascript
复制
library(tidyverse) 

df %>% 
  pivot_longer(-c(Name, Age)) %>% 
  mutate(value = case_when(Age < parse_number(name) ~ 0, 
                           TRUE ~ NA_real_)) %>% 
  pivot_wider(names_from = name, 
              values_from = value)

# A tibble: 5 x 5
  Name    Age Age_Kid_17 Age_Kid_18 Age_Kid_20
  <chr> <dbl>      <dbl>      <dbl>      <dbl>
1 Jon       7          0          0          0
2 Bill     12          0          0          0
3 Maria    19         NA         NA          0
4 Ben      18         NA         NA          0
5 Tina     30         NA         NA         NA
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/73212002

复制
相关文章

相似问题

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