3

列 1 で名前が繰り返され、次に数値である他の 3 つの列を持つデータ セットがあります。

繰り返される名前の行を1つの列に結合し、2つの列を合計して、もう1つの列をそのままにしたいと考えています。これを行う簡単な方法はありますか?私はsapplyとlapplyでそれを理解しようとしてきましたが、ここで多くのQ&Aを読みましたが、解決策が見つからないようです

Name <- c("Jeff", "Hank", "Tom", "Jeff", "Hank", "Jeff",
                       "Jeff", "Bill", "Mark")
data.Point.1 <- c(3,4,3,3,4,3,3,6,2)
data.Point.2 <- c(6,9,2,5,7,4,8,2,9)
data.Point.3 <- c(2,2,8,6,4,3,3,3,1)
data <- data.frame(Name, data.Point.1, data.Point.2, data.Point.3)

データは次のようになります。

  Name data.Point.1 data.Point.2 data.Point.3
1 Jeff            3            6            2
2 Hank            4            9            2
3  Tom            3            2            8
4 Jeff            3            5            6
5 Hank            4            7            4
6 Jeff            3            4            3
7 Jeff            3            8            3
8 Bill            6            2            3
9 Mark            2            9            1

私はそれを次のようにしたいと思います (列 3 と 4 を合計し、列 1 だけを残します。次のようにしたいと思います:

  Name data.Point.1 data.Point.2 data.Point.3
1 Jeff            3           23           14
2 Hank            4           16            6
3  Tom            3            2            8
8 Bill            6            2            3
9 Mark            2            9            1

どんな助けでも素晴らしいでしょう。ありがとう!

4

3 に答える 3

3

もう少し簡単な別の解決策は、ライブラリを使用することですdplyr

library(dplyr)
data <- data %>% group_by(Name, data.Point.1) %>%  # group the columns you want to "leave alone"
  summarize(data.Point.2=sum(data.Point.2), data.Point.3=sum(data.Point.3)) # sum columns 3 and 4

「そのままにしておく」以外の他のすべての列を合計したい場合は、次のように置き換えsummarize(data.Point.2=sum(data.Point.2), data.Point.3=sum(data.Point.3))ますsummarise_each(funs(sum))

于 2015-03-18T19:22:02.053 に答える
1

を使用してこのようにしdata.tableます:

setDT(data)[, c(data.Point.1 = data.Point.1[1L], 
                lapply(.SD, sum)), by=Name, 
                .SDcols = -"data.Point.1"]
#    Name data.Point.1 data.Point.2 data.Point.3
# 1: Jeff            3           23           14
# 2: Hank            3           16            6
# 3:  Tom            3            2            8
# 4: Bill            3            2            3
# 5: Mark            3            9            1

でグループ化しName、グループごとに の最初の要素を取得data.Point.1し、残りの列については、sum基本関数を使用して計算し、データのサブセットを表すlapplyの列をループします。の列は によって提供され、 を削除して、他のすべての列は に提供されます。.SD.SD.SDcolsdata.Point.1.SD

詳細については、 HTML ビネットを確認してください。

于 2015-03-18T21:09:03.713 に答える
0

あなたは試すことができます

library(data.table)
setDT(data)[, list(data.Point.1=data.Point.1[1L],
    data.Point.2=sum(data.Point.2), data.Point.3=sum(data.Point.3)), by=Name]
#    Name data.Point.1 data.Point.2 data.Point.3
#1: Jeff            3           23           14
#2: Hank            4           16            6
#3:  Tom            3            2            8
#4: Bill            6            2            3
#5: Mark            2            9            1

または使用してbase R

data$Name <- factor(data$Name, levels=unique(data$Name))
res <- do.call(rbind,lapply(split(data, data$Name), function(x) {
                x[3:4] <- colSums(x[3:4])
                x[1,]} ))

またはを使用してdplyrsummarise_each複数の列に適用する必要がある関数を適用しcbind、単一の列の「要約」出力を使用して出力を適用できます

library(dplyr)
res1 <- data %>%
            group_by(Name) %>% 
            summarise(data.Point.1=data.Point.1[1L])

res2 <- data %>%
            group_by(Name) %>% 
                          summarise_each(funs(sum), 3:4)
cbind(res1, res2[-1])
#   Name data.Point.1 data.Point.2 data.Point.3
#1 Jeff            3           23           14
#2 Hank            4           16            6
#3  Tom            3            2            8
#4 Bill            6            2            3
#5 Mark            2            9            1

編集

作成されたデータと最初に表示されたデータは、元の投稿で異なりました。OP の投稿 (@dimitris_ps による) を編集した後、コードgroup_by(Name)をに置き換えることで期待される結果を得ることができます。group_by(Name, data.Point.1)res2 <- ..

于 2015-03-18T18:51:52.550 に答える