簡體   English   中英

在R中使用data.table有條件地合並列

[英]Combining columns conditionally using data.table in R

我有一個包含一組植物的數據集。 這些植物中有兩個具有多條品系。 在分析數據時,我希望有一個列,該列將把具有多行的兩個工廠放在一起,而所有其他工廠保持原樣。 這是我的可復制數據集:

testset <- data.table(date=as.Date(c("2013-07-02","2013-08-03","2013-09-04","2013-10-05","2013-11-06")), yr = c(2013,2013,2013,2013,2013), mo = c(07,08,09,10,11), da = c(02,03,04,05,06), plant = LETTERS[1:5], PlantID = c(1,2,3,4,5,1,2,3,6,7), product = as.factor(letters[26:22]), rating = runif(25))

這是我正在尋找的附加列輸出:

A1

B2

C3

D4

E5

A1

B2

C3

D6

E7

這是一個簡單的示例,但是我的真實數據集要大得多,所以我想用一種優雅的data.table方法來生成它。

使用data.table時, data.table 相反,您應該設置一個key或使用即席 by (如我在下面的示例中所示)。 這是data.table中操作的關鍵基礎之一。


使用玩具例如by

看下面的玩具例子。 我們通過idgrp變量求和。 因此,在存在重復項的地方,它們會被求和,但是分組變量的唯一組合將由它們自己處理(因此請注意,具有唯一分組變量組合的最后一行的ratingsum_rating的值(其他行各有兩行)如您的示例):

# Make this data reproducible
set.seed(1)
dt <- data.table( id = c( rep( 1:2 , 2 ) , 1 ) , grp = c( rep( 1:2 , 2 ) , 3 ) , rating = sample( 5 , 5 , TRUE ) ) 
#   id grp rating
#1:  1   1      4
#2:  2   2      1
#3:  1   1      3
#4:  2   2      4
#5:  1   3      4

# Sum by 'id' and 'grp'...
dt[ , sum_rating := sum( rating ) , by = list( id , grp ) ]
dt
#   id grp rating sum_rating
#1:  1   1      4          7
#2:  2   2      1          5
#3:  1   1      3          7
#4:  2   2      4          5
#5:  1   3      4          4  <=====  rating and sum_rating are the same because this is a unique row

我不了解您所期望的輸出是什么,但是希望這會對您有所幫助。 這是一個用於查找所有唯一工廠線的data.table解決方案:

> testset[,unique(paste0(plant, PlantID))]
[1] "A1" "B2" "C3" "D4" "D6" "E5" "E7"

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM