我仍然在用 R 做我的第一步,并发现 SO 是一个很好的工具,可以学习更多信息并找到我的问题的答案。对于这个,我虽然没有在这里找到任何好的解决方案。

我有一个可以简化为这种结构的数据框:

set.seed(10)
df <- data.frame(v1 = rep(1:2, times=3),
v2 = c("A","B","B","A","B","A"),
v3 = sample(1:6),
xA_1 = sample(1:6),
xA_2 = sample(1:6),
xB_1 = sample(1:6), xB_2 = sample(1:6))

df 因此看起来像这样:
> df
   v1 v2 v3   xA_1 xA_2 xB_1 xB_2
1  1  A  4    2    1    3    3
2  2  B  2    6    3    5    4
3  1  B  5    3    2    4    5
4  2  A  3    5    4    2    1
5  1  B  1    4    6    6    2
6  2  A  6    1    5    1    6

我现在希望 R 创建第四个变量,该变量取决于 v1 和 v2 的值。我通过使用以下代码来实现这一点:
df <- data.table(df)
df[, v4 := ifelse(v1 == 1 & v2 == "A", v3*xA_1,
        ifelse(v1 == 1 & v2 == "B", v3*xB_1,
         ifelse(v1 == 2 & v2 == "A", v3*xA_2,
          ifelse(v1 == 2 & v2 == "B", v3*xB_2, v3*1))))]

因此 v4 是通过将 v3 与包含 v1 和 v2 值的列相乘而创建的
(例如,对于第 1 行: v1=1 and v2=A thus multiply v3=4 with xA_1=2 -> 8 )。
> df$v4
[1]  8  8 20 12  6 30

显然,当 v1 和 v2 实际上具有比本示例中更多的不同值时,我的 ifelse 方法很乏味。所以我正在寻找一种有效的方法来告诉 R if v1 == y & v2 == z, multiply v3 with column xy_z

我尝试编写一个 for 循环,编写一个以 y 和 z 作为索引的函数并使用 apply 函数。然而,这一切都没有如愿。

我很欣赏任何想法!

最佳答案

这是一个基本的 R 选项:

i <- paste0("x", df$v2, "_", df$v1)
df$v4 <- df$v3 * as.numeric(df[cbind(1:nrow(df), match(i, names(df)))])

对于下面提供的示例数据,它创建一列 v4 为:
> df$v4
[1] 25 12  2  6  3 10

或者,如果您想包含“else”条件以乘以 1,以防没有匹配的列名:
i <- paste0("x", df$v2, "_", df$v1)
tmp <- as.numeric(df[cbind(1:nrow(df), match(i, names(df)))])
df$v4 <- df$v3 * ifelse(is.na(tmp), 1, tmp)

样本数据:
df <- structure(list(v1 = c(1L, 2L, 1L, 2L, 1L, 2L), v2 = structure(c(1L,
2L, 2L, 1L, 2L, 1L), .Label = c("A", "B"), class = "factor"),
    v3 = c(5L, 4L, 1L, 6L, 3L, 2L), xA_1 = c(5L, 6L, 3L, 1L,
    2L, 4L), xA_2 = c(6L, 4L, 2L, 1L, 3L, 5L), xB_1 = c(4L, 6L,
    2L, 5L, 1L, 3L), xB_2 = c(5L, 3L, 2L, 4L, 1L, 6L)), .Names = c("v1",
"v2", "v3", "xA_1", "xA_2", "xB_1", "xB_2"), row.names = c(NA,
-6L), class = "data.frame")

关于r - 选择一列相乘,取决于其他变量的值,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/36427946/

10-12 23:24