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。
答案 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
不变,前提是上述条件均不满足。