R dplyr:使用在同一列中找到的参考值来突变特定值

时间:2017-08-14 20:06:55

标签: r dplyr mutate

如何使用同一列中找到的参考值来改变列中的特定值?数据框如下所示:

A  Ref  20
A  S1   12
A  S2   76
A  S3   12
A  S4   12
A  XY   89
B  Ref  02
B  S1   12
B  S2   42
B  S3   21
B  S4   12
B  XY   56

我想通过将所有S值除以Ref值来改变,但不是XY的值。

基本上是S1 / Ref,S2 / Ref,...... S4 /参考A和B,不包括XY的值。

提前致谢。

1 个答案:

答案 0 :(得分:1)

以下是使用dplyr执行此操作的一种方法。在按第一列分组后,请说“' v1'”,然后选择' v3'除以' v3'其中' v2'是' Ref' (假设每个唯一的' v1'只有一个' Ref'然后替换' newcol'其中' v2'列值不是" S \ d +"即" S"后跟带有' v3'值的数字。

library(dplyr)
df1 %>%
  group_by(v1) %>% 
  mutate(newcol = v3/v3[v2 == "Ref"], 
         newcol = ifelse(!grepl("^S\\d+", v2), v3, newcol))
# A tibble: 12 x 4
# Groups:   v1 [2]
#      v1    v2    v3 newcol
#   <chr> <chr> <int>  <dbl>
# 1     A   Ref    20   20.0
# 2     A    S1    12    0.6
# 3     A    S2    76    3.8
# 4     A    S3    12    0.6
# 5     A    S4    12    0.6
# 6     A    XY    89   89.0
# 7     B   Ref     2    2.0
# 8     B    S1    12    6.0
# 9     B    S2    42   21.0
#10     B    S3    21   10.5
#11     B    S4    12    6.0
#12     B    XY    56   56.0

假设我们只需要更换&#39; XY&#39;使用&#39; v3&#39;的值,将最后一行替换为newcol = ifelse(v2 == "XY", v3, newcol))

数据

df1 <- structure(list(v1 = c("A", "A", "A", "A", "A", "A", "B", "B", 
"B", "B", "B", "B"), v2 = c("Ref", "S1", "S2", "S3", "S4", "XY", 
"Ref", "S1", "S2", "S3", "S4", "XY"), v3 = c(20L, 12L, 76L, 12L, 
12L, 89L, 2L, 12L, 42L, 21L, 12L, 56L)), .Names = c("v1", "v2", 
"v3"), class = "data.frame", row.names = c(NA, -12L))