如何使用同一列中找到的参考值来改变列中的特定值?数据框如下所示:
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的值。
提前致谢。
答案 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))