我正在尝试创建一个代码,它使用另一个变量的值来只变异几个列。我在举一个可重复性的例子。
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)我希望根据列“年龄”的值来更改列的值,并使用该值来确定要更改的列。下面的循环确实有效,但在我正在处理的情况下需要花费太长时间。
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}
}
}发布于 2022-08-02 18:33:28
汤姆的回答是个不错的选择。您也可以在不使用pivot的情况下按以下方式执行此操作。另外,请注意,您的循环代码创建了一个名为"Age_Kid_19“的列,该列在输入数据中不存在。这是故意的吗?
在这里使用rowwise()并不是绝对必要的,但它将确保dplyr单独处理每一行,就像循环代码一样,如果这与实际数据相关的话。
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发布于 2022-08-02 18:27:04
这就是你要找的吗?
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 NAhttps://stackoverflow.com/questions/73212002
复制相似问题