对R数据框中的字符列求和以创建新列

时间:2014-11-21 21:43:44

标签: r

我目前在R中有一个数据框,其中每个条目都是一个字符。但是,每个字符也对应一个点值,其中:B = 10S = 1C = 1X = 0

例如,请考虑以下数据框

> df = data.frame(p1 = c("B", "B", "C", "C", "S", "S", "X"), p2 = c("X", "B", "B", "S", "C", "S", "X"), p3 = c("C", "B", "B", "X", "C", "S", "X"))
> df
  p1 p2 p3
1  B  X  C
2  B  B  B
3  C  B  B
4  C  S  X
5  S  C  C
6  S  S  S
7  X  X  X

我想在R中创建三个新列:c1c2c3这些列基本上是"滞后"对p1p2p3值求和(使用每个字符的数值)。

  p1 p2 p3 c1 c2 c3
1  B  X  C 0  10 10
2  B  B  B 0  10 20
3  C  B  B 0  1  11
4  C  S  X 0  1  2
5  S  C  C 0  1  2
6  S  S  S 0  1  2
7  X  X  X 0  0  0

例如,c1始终初始化为0. c2将是p1的分值,c3将是c2的总和和p1的点值。

一般c_i = c_{i-1} + p_{i-1}

在R中有一种简单的方法吗?提前谢谢你,因为我是一个相对新手的R用户。

1 个答案:

答案 0 :(得分:2)

这样的事情会起作用。 matchFun是执行匹配的函数。

matchFun <- function(x) c(10, 1, 1, 0)[x]

within(df, {
    c3 <- rowSums(sapply(list(p1, p2), matchFun))
    c2 <- matchFun(p1)
    c1 <- 0L
})
#   p1 p2 p3 c1 c2 c3
# 1  B  X  C  0 10 10
# 2  B  B  B  0 10 20
# 3  C  B  B  0  1 11
# 4  C  S  X  0  1  2
# 5  S  C  C  0  1  2
# 6  S  S  S  0  1  2
# 7  X  X  X  0  0  0