2013-05-08 52 views
0

背景:我有一列有重複值的數據框。我試圖通過挑出所有具有重複列值的行來分割這個數據幀,處理它們,然後用所有處理過的行吐出一個新的數據幀。獨特列值的子集數據框的行爲

我很驚訝,因爲到了什麼錯誤在這裏下面的代碼:

dataSet <- structure(list(DAY = structure(1:10, .Label = c("Tuesday", 
    "Tuesday", "Tuesday", "Tuesday", "Tuesday", 
    "Tuesday", "Tuesday", "Tuesday", "Tuesday", 
    "Tuesday", "Tuesday", "Tuesday", "Tuesday", 
    "Tuesday", "Tuesday", "Tuesday", "Tuesday", 
    "Tuesday", "Tuesday", "Tuesday", "Tuesday", 
    "Tuesday", "Tuesday", "Tuesday"), class = "factor"), 
     variable = structure(c(1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 1L, 
     1L), .Label = c("act1", "act2", "act3", "act4", 
     "act5", "act12", "act19", "act116", "act22", 
     "act6", "act13", "act111", "act117", "act23", 
     "act7", "act14", "act112", "act118", "act24", 
     "act8", "act15", "act113", "act119", "act25", 
     "act9", "act16", "act114", "act20", "act26", 
     "act10", "act17", "act115", "act21", "act27", 
     "act11", "act18"), class = "factor"), value = c(67, 
     65, 40, 79, 106, 90, 57, 59, 2, 12)), .Names = c("DAY", 
    "variable", "value"), row.names = c(NA, 10L), class = "data.frame") 


uniq <- unique(dataSet$variable) 
for (i in 1:length(uniq)){ 
    rowsPerVal <- dataSet[dataSet$variable == uniq[i], ] 
    print(length(rowsPerVal)) 
} 

我只是不明白最後的print語句怎麼說的長度爲3,當有10個記錄在具有相同值的數據幀爲variable列。

+3

數據幀的「長度」是列數,因爲它實際上是一個列表。你可能是指'nrow'或者其他東西。 – joran 2013-05-08 20:09:33

+0

嗯,在你的例子中你只有一個「uniq」值。這足以說明你的問題嗎?噢,別介意,喬蘭的權利:'印刷(nrow(...))'而不是。或者更好,只是'print(sum(dataSet $ variable == uniq [i]))'並跳過上面的行。當然也有一種不循環的方法。 – Frank 2013-05-08 20:18:32

回答

3

plyr也有利於這種拆分申請,結合問題(分割的數據設置成塊,對每一個操作,並放回在一起)。

library("plyr") 
ddply(dataSet, .(variable), nrow) 

正如其他人所說一個data.framelength()是列數; nrow()是行數。

> ddply(dataSet, .(variable), nrow) 
    variable V1 
1  act1 10 

您可以替換nrow用(匿名)函數,你想要做任何處理。

1

duplicated僅返回第2 +項的TRUE。所以,你可以用它來索引你行:

dataSet[duplicated(dataSet$variable),] 

您也可以爲他們分配:

dataSet[duplicated(dataSet$variable),]$value <- NA 
> dataSet 
     DAY variable value 
1 Tuesday  act1 67 
2 Tuesday  act1 NA 
3 Tuesday  act1 NA 
4 Tuesday  act1 NA 
5 Tuesday  act1 NA 
6 Tuesday  act1 NA 
7 Tuesday  act1 NA 
8 Tuesday  act1 NA 
9 Tuesday  act1 NA 
10 Tuesday  act1 NA 

要「吐出一個新的數據幀的所有處理行」,你可以處理子集化的data.frame但是你喜歡:

newDF <- transform(dataSet[duplicated(dataSet$variable),], DAY=sub("esd","foo",DAY)) 
+0

我不明白這與問題有關。 – 2013-05-08 21:20:03

+0

@BrianDiggs問題有點含混不清,但是「通過挑選出所有具有重複列值的行來拆分這個數據框」是Iw關注的重點,因爲這就是他嘗試使用「unique」的原因。我會改變我的答案,正確回答他的第二部分,'吐出一個新的數據框,所有處理過的行'。 – 2013-05-08 21:36:33

+0

我擔心'重複'不能識別組中的所有行(每組一行不存在,並且所有輔助行都聚集在一個組中)。您的編輯解決了我認爲重點所在。刪除投票:) – 2013-05-08 21:40:42