列匹配并从不同列获取总和

时间:2014-05-21 21:50:51

标签: r

您好我是R的新手,我正在尝试解决可能非常简单的问题。 所以,这是:

c1   c2   c3   c4
a    8    f    5
b    9    c    4
c    7    b    3 
d    5    a    2
e    1    d    5
f    5    e    4

我想匹配列c1和c3并获得c2和c4的总和 所以答案应该是

a   10
b   12
c   11
...

我使用了匹配功能来获得2列之间的匹配,我得到了,但我不知道如何从其他列获得总数

请帮助我,这只是一个例子,但如果有效,我可以解决我的测序数据。

谢谢。

4 个答案:

答案 0 :(得分:2)

您可以尝试以下内容:

## Your data.frame
df <- data.frame(c1=letters[1:6], c2=c(8,9,7,5,1,5), 
                 c3=c("f", "c", "b", "a", "d", "e"), c4=c(5,4,3,2,5,4))

## Match the indices of column 1 to column 3
m <- match(df$c1, df$c3)

## Sum columns 2 and 4, where 4 is rearanged to match column 1
data.frame(c1 = df$c1, ans = df$c2 + df$c4[m])

##  c1 ans
##  1  a  10
##  2  b  12
##  3  c  11
##  4  d  10
##  5  e   5
##  6  f  10

希望它有所帮助,

亚历

答案 1 :(得分:1)

这可能不是最有效的方法,但应该有效:

# Split the data into two frames
temp1 = data.frame(a=data$a, b=data$b)
temp2 = data.frame(c=data$c, d=data$d)

#Now merge them based on the 'a' and 'c' columns
out = merge(temp1,temp2, by.x='a', by.y='c')

#Now we can sum the 'b' and 'd' columns
out$sum = out$b+out$d

那应该给你你想要的东西?

答案 2 :(得分:1)

这也可行

#sample data
dd<-data.frame(
    c1 = c("a", "b", "c", "d", "e", "f"), 
    c2 = c(8L, 9L, 7L, 5L, 1L, 5L), 
    c3 = c("f", "c", "b", "a", "d", "e"), 
    c4 = c(5L, 4L, 3L, 2L, 5L, 4L)
)

#stopifnot(levels(dd$c1)=levels(dd$c3))

sums <- with(dd, c2[order(c1)]+c4[order(c3)])

基本上你只是求助c2c4所以它们与配对因子相对应,然后直接添加。

答案 3 :(得分:0)

这是一个建议,但只有当c1和c3的元素都是唯一的时才会起作用。如果是这种情况,您可以使用which()功能。这样的事情:c2[which(c1 == x)] + c4[which(c3) == x]会给出c1为x时c2值和c3为x时c4值的总和。