修改列以某些数字开头的行

时间:2019-03-13 10:07:03

标签: r dplyr

df <- data.frame(ID = rep("variable", 9),
                 national_id = rep(-9999, times = 9),
                 state_id = c(rep(-9999, times = 5), 11, 22, 25, -9999),
                 district_id = c(11011, 11201, 22013, 22014, 25016, -9999, -9999, -9999, -9999),
                 d_value = rnorm(9),
                 p_value = rnorm(9))

我想为d_value的前两位为11的那些行选择1并将其添加到distict_id中。

类似地,我想为d_value的前两位为22的那些行添加0.6(或任何数字)distict_id

此外,我想为d_value的前两位为22的那些行添加0.6(或任何数字)district_id。 对于“ state_id”为11的那些行,我想在“ d_value”中添加0.9。

2 个答案:

答案 0 :(得分:2)

看起来像一个子字符串(或RegEx)练习,基数R也可以处理。用前两位数字创建一个附加的(帮助程序)列。这里是子串的解决方案。

df$first_2_digits <- substr(x = df$district_id, start = 1, stop = 2)

之后是“正常”索引。

df[df$first_2_digits == 11, "d_value"] <- df[df$first_2_digits == 11, "d_value"] + 0.9 

可以很容易地打包成一个函数,并且可以用两个以上的数字和“切换”函数的组合进行扩展。

答案 1 :(得分:0)

如@markus所述,这是case_when的好例子,在这里您可以有多个条件并可以输出这些条件。

library(tidyverse)

df %>%
  mutate(d_value = case_when(str_detect(district_id, "^11") ~ d_value + 1, 
                             str_detect(district_id, "^22") ~ d_value + 0.6, 
                             state_id == 11 ~ d_value + 0.9, 
                             TRUE ~ d_value))

我们根据指定的条件更改d_value的值,并使用TRUE ~ d_value保持d_value不变,前提是上述条件均不满足。