2016-05-30 17 views
0

は、私は列に同じ値を持つ行を見つけたいのは、私は、このデータフレームからタイプR:同じ要素を含む行のための和を計算する

df <- data.frame(1:10,2:11,rep(5,10)) 
df[10,1:2] <- c(2,1) 
> df 
     X1.10 X2.11 rep.5..10. 
    1  1  2   5 
    2  2  3   5 
    3  3  4   5 
    4  4  5   5 
    5  5  6   5 
    6  6  7   5 
    7  7  8   5 
    8  8  9   5 
    9  9 10   5 
    10  2  1   5 

のデータフレームがあるとしましょう1と2列の場合は、これらの行の列3の値を合計し、これらの行の1つに合計を割り当て、次にデータフレームから他の見つかった行を削除します。そうDFで、例えば私は、行1および10を見つける5 + 5和を計算し、行1のカラム3に10を割り当て、そして最終的に行10 Iを使用することができない

> df 
    X1.10 X2.11 rep.5..10. 
1  1  2   10 
2  2  3   5 
3  3  4   5 
4  4  5   5 
5  5  6   5 
6  6  7   5 
7  7  8   5 
8  8  9   5 
9  9 10   5 

を除去したいFOR-データセットがかなり大きいため、ループが発生します。この問題の効果的な解決策は何でしょうか?

+2

。何か試しましたか?あなたの例で1行目と10行目はなぜですか?最初の2つの列には異なる値があります。 –

+0

この意味で、列の順序は重要ではなく、すなわちc(2,1) "==" c(1,2)である。私がちょうど私ができると思ったのは、カラム1とカラム2の順序を変えて、カラム1とカラム2の値が常に同じになるようにすることです。次に、カラム1とカラム2 )。 – jorkku

+2

あなたは[here](https://stackoverflow.com/questions/37388766/pairwise-unique-combinations-ignoring-the-direction)として進み、 'aggregate'を使用することができます –

答えて

2

ここでは、あなたの期待に到着する行とaggregate()をソートするapply()を使用する代替です出力。

# Reorder values in first 2 cols and cbind with df[,3] 
m <- cbind(t(apply(df[1:2], 1, sort)), df[,3]) 

# Sum third column grouped by first and second column 
aggregate(m[,3], by = list(m[,1],m[,2]),FUN=sum) 
# Group.1 Group.2 x 
#1  1  2 10 
#2  2  3 5 
#3  3  4 5 
#4  4  5 5 
#5  5  6 5 
#6  6  7 5 
#7  7  8 5 
#8  8  9 5 
#9  9  10 5 
1

apply関数を使用すると、column1とcolumn2をソートしてからgroupbyサマリーを実行できます。これを行うには

library(dplyr) 
sorted <- t(apply(df, 1, function(row) c(row[-3][order(row[-3])], row[3]))) 

data.frame(sorted) %>% group_by(X1, X2) %>% mutate(X3 = sum(X3)) %>% unique() 
Source: local data frame [9 x 3] 
Groups: X1, X2 [9] 

    X1 X2 X3 
    (dbl) (dbl) (dbl) 
1  1  2 10 
2  2  3  5 
3  3  4  5 
4  4  5  5 
5  5  6  5 
6  6  7  5 
7  7  8  5 
8  8  9  5 
9  9 10  5 

data.tableの方法は、次のようになります。

library(data.table) 
sorted <- t(apply(df, 1, function(row) c(sort(row[-3]), row[3]))) 
data.table(sorted)[, .(V3 = sum(V3)), .(V1, V2)] 

    V1 V2 V3 
1: 1 2 10 
2: 2 3 5 
3: 3 4 5 
4: 4 5 5 
5: 5 6 5 
6: 6 7 5 
7: 7 8 5 
8: 8 9 5 
9: 9 10 5 

データ

structure(list(X1.10 = c(1, 2, 3, 4, 5, 6, 7, 8, 9, 2), X2.11 = c(2, 
3, 4, 5, 6, 7, 8, 9, 10, 1), rep.5..10. = c(5, 5, 5, 5, 5, 5, 
5, 5, 5, 5)), .Names = c("X1.10", "X2.11", "rep.5..10."), row.names = c(NA, 
-10L), class = "data.frame") 
0

だけ使用して基地機能:

やるべきことがたくさんだ
df <- data.frame(x = c(1:9, 2), y = c(2:10, 1), z = rep(5,10)) 
df$t <- df$x + df$y 
df2 <- aggregate(z ~ t, data = df, FUN = sum) 
final <- merge(df, df2, by = "t") 
final <- final[which(!duplicated(final$t)), ] 
final$t <- NULL 
final$z.x <- NULL 

print(final) 
    x y z.y 
1 1 2 10 
3 2 3 5 
4 3 4 5 
5 4 5 5 
6 5 6 5 
7 6 7 5 
8 7 8 5 
9 8 9 5 
10 9 10 5 
関連する問題