R 基于前一列中的值替换多列中的值

R 基于前一列中的值替换多列中的值,r,R,我的示例数据如下所示(实际数据要大得多) 库(tidyverse,warn.conflications=F) df一个使用dplyr和purrr的选项可以是: bind_cols(df %>% select(1) %>% mutate_all(~ na_if(., 0)), map_dfc(.x = 2:length(df), ~ df %>%

我的示例数据如下所示(实际数据要大得多)

库(tidyverse,warn.conflications=F)

df一个使用
dplyr
purrr
的选项可以是:

bind_cols(df %>%
           select(1) %>%
           mutate_all(~ na_if(., 0)),
          map_dfc(.x = 2:length(df),
                  ~ df %>% 
                   mutate_at(vars(starts_with("chr")), ~ na_if(., 0)) %>%
                   transmute_at(vars(.x), ~ replace(., !!is.na(select(., .x - 1)), NA))))

   chr_x pos_x chr_y pos_some
   <dbl> <dbl> <dbl>    <dbl>
 1    NA    NA     1        1
 2    NA    NA     2        2
 3     1     3     3        3
 4     1     4     3        4
 5     1     5     3        5
 6     4     6     2        6
 7     4     7     1        7
 8     4     8     1        8
 9     5     9    NA       NA
10     5     0    NA       NA
11     6     1     1        1
12     7     2     5        2
bind_cols(df%>%
选择(1)%>%
变异所有(~na_如果(,0)),
映射_dfc(.x=2:长度(df),
~df%>%
在(变量(以“chr”开头)处突变,~na_如果(,0))%>%
transmute_at(vars(.x),~replace(,!!is.na(select(,.x-1)),na)))
chr_x pos_x chr_y pos_一些
1 NA NA 11
2 NA NA 2 2
3     1     3     3        3
4     1     4     3        4
5     1     5     3        5
6     4     6     2        6
7     4     7     1        7
8     4     8     1        8
959NA
1050NA
11     6     1     1        1
12     7     2     5        2

我们可以使用
基本R
。创建'chr'列('i1')的索引,将列'chr'子集,将对应于0的值转换为NA('i2'),并通过与i2相乘来更新'i1'以及下一个('i2')的位置

i1 <- which(startsWith(names(df), 'chr'))
i2 <- NA^(df[i1] == 0)
df[i1] <- df[i1] * i2
df[i1 + 1] <- df[i1 + 1] * i2
df
# A tibble: 12 x 4
#   chr_x pos_x chr_y pos_some
#   <dbl> <dbl> <dbl>    <dbl>
# 1    NA    NA     1        1
# 2    NA    NA     2        2
# 3     1     3     3        3
# 4     1     4     3        4
# 5     1     5     3        5
# 6     4     6     2        6
# 7     4     7     1        7
# 8     4     8     1        8
# 9     5     9    NA       NA
#10     5     0    NA       NA
#11     6     1     1        1
#12     7     2     5        2

i1是一个非常漂亮的解决方案。这非常好。我以前没有见过这种符号。
NA^(df[i1]==0)
你能解释一下吗?似乎它将匹配值替换为
NA
1
@cropgen的所有其他值。它基于
NA^0
NA^1
,分别返回1和NA。逻辑向量TRUE/FALSE(
df[i1]==0
)在内部是
1/0
,因此会得到您注意到的行为谢谢您的解决方案,它可以工作,但看起来有点复杂。