我目前在R中有一个数据框,其中每个条目都是一个字符。但是,每个字符也对应一个点值,其中:B = 10
,S = 1
,C = 1
,X = 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中创建三个新列:c1
,c2
,c3
这些列基本上是"滞后"对p1
,p2
和p3
值求和(使用每个字符的数值)。
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用户。
答案 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