[英]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
: 看下面的玩具例子。 我們通過id
和grp
變量求和。 因此,在存在重復項的地方,它們會被求和,但是分組變量的唯一組合將由它們自己處理(因此請注意,具有唯一分組變量組合的最后一行的rating
和sum_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.