library(tidyverse)
library(magrittr)

df <- data.frame(year = c(1977:1981), set852 = c(1,1,0,0,0), set857=c(0,0,1,1,0), set874=c(0,0,0,1,1))

对于每个变量set852、set857等等(在真实数据集中是一个很长的列表),我想创建一个变量来指示时间序列中是否有变化(值将是"Start"、"End"和"No Change").其他变量应如下所示:

df_final <- data.frame(year = c(1977:1981), c852 = c("start","end","no change","no change","no change"), c857=c("no change","no change","start","end","no change"), c874=c("no change","no change","no change","start","end"))

我在tidyVerse中try 了这一点,使用了for-loop、mutic、Paste和case_When:

set_num <- as.integer(str_extract(colnames(df), "[0-9]+"))

for (i in 2:nrow(df))
{
  df %<>% mutate(paste0("c", set_num[[i]]) = case_when(paste("set", set_num[[i]], sep="")==1 & year == 1977 ~ "start",
             paste("set", set_num[[i]], sep="")==1 & lag(paste("set", set_num[[i]], sep=""))==0 ~ "start",
             paste("set", set_num[[i]], sep="")==1 & lead(paste("set", set_num[[i]], sep=""))==0 ~ "end",
TRUE~"no change"))
}

然而,Mutations 后的粘贴函数不会被识别为函数,而是以"paste0"("c"...,依此类推)开头的变量名.如何获得将paste0函数注册为函数而不是字符串的代码?

编辑:人们似乎对什么是变化感到困惑.1-1-1-0-0的序列将是Start-nochange-end-nochange-nochange

推荐答案

使用dplyr::across代替for循环,您可以获得所需的结果,如下所示:

library(dplyr, warn = FALSE)

df <- data.frame(
  year = c(1977:1981),
  set852 = c(1, 1, 0, 0, 0),
  set857 = c(0, 0, 1, 1, 0),
  set874 = c(0, 0, 0, 1, 1)
)

myfun <- function(.x, year) {
  case_when(
    .x == 1 & year == 1977 ~ "start",
    .x == 1 & lag(.x) == 0 ~ "start",
    .x == 1 & lead(.x) == 0 ~ "end",
    .default = "no change"
  )
}

set_cols <- grep("\\d+$", names(df), value = TRUE)

df |>
  mutate(
    across(all_of(set_cols), ~ myfun(.x, year),
      .names = "{gsub('^.*?(\\\\d+)$', 'c\\\\1', .col)}"
    )
  ) |> 
  select(-all_of(set_cols))
#>   year      c852      c857      c874
#> 1 1977     start no change no change
#> 2 1978       end no change no change
#> 3 1979 no change     start no change
#> 4 1980 no change       end     start
#> 5 1981 no change no change no change

R相关问答推荐

使用Shiny组合和显示复制和粘贴的数据

为什么以及如何修复Mapview不显示所有点并且st_buffer合并一些区域R?

以R为基数排列奇数个图

寻找图片边缘

名称输出pmap on tible

根据模式将一列拆分为多列,并在R中进行拆分

在连续尺度上转置标签[瀑布图,R]

使用data.table::fcase()而不是dplyr::case_When()时保持值

R中的哈密顿滤波

仅 Select 超过9行的CSV文件

自定义gggraph,使geom_abline图层仅在沿x轴的特定范围内显示

手动指定从相同数据创建的叠加图的 colored颜色

远离理论值的伽马密度曲线下面积的近似

防止在更新SHINY中的Reactive Value的部分内容时触发依赖事件

当由base::限定时,`[.factor`引发NextMethod错误

如何合并不同列表中的数据文件,包括基于名称的部分匹配,而不是一对一等价

将数据从一列转换为按组累计计数的单个虚拟变量

如何使投篮在R中保持一致

GOGPLATE geom_boxploy色彩疯狂

通过分析特定列中的字符串在数据框中创建新的行和列