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
,因此会得到您注意到的行为谢谢您的解决方案,它可以工作,但看起来有点复杂。