2013-01-11 58 views
0

我有點失去了執行我想在R中執行的最佳方式。根據重複和其他列的條件添加列R

我有一個包含多列的數據幀。其中一個是用戶和其他列,讓我們說數字(0,1,2,3,4,5)。有時用戶重複,但在這種情況下,列號應該有一個數字序列。可以是這樣的:

user number column B column C 
1 0  85  200 
2 1  165  852 
1 2  200  1000 
3 0  15  689 
3 1  89  896 
4 0  78  582 
4 2  96  586 

我想獲得的是:

user number status days 
1 0  0  200 
3 0  1  50 ->(value column C, user 3, number 1)-(value column B, user 3, number 0) 
4 0  0  200 

我想兩列添加到基於這些用戶的價值數據幀。

  • 如果用戶有多個== 0,但用戶是獨特的地位== 0和天==一些預定數量
  • 如果用戶有多個== 0和用戶不是唯一
    • 如果用戶第二次出現的數== 1,狀態== 1和天應該從用戶的值的列C的第二次出現的相減 - 值塔B的第一用戶
    • 外觀如果用戶第二次出現具有數!= 1,狀態== 0和天==一些預定數量
  • 從數據集刪除用戶沒有數字== 0

我問這個問題,因爲我是一個有點困惑做到這一點的最好辦法。我雖然關於子集的數據框在數字== 0,然後比較用戶之間的數據幀看到重複的用戶,但也許這不是最好的辦法做到這一點。

任何指針和想法將是巨大的!

謝謝您的幫助

編輯

columnB是因爲 '2002-01-01' 已經過去的天數。例如,第一用戶在數據幀85後的天2002-01-01

進入columnC是用戶停留在觀察的天數。在那些日子之後,用戶不再在數據庫中。

EDIT2

我的數據集有36列和26075rows

一些建議,哪裏就是我到目前爲止之後。

#remove from dataset all users that don't have number == 0 
df1 <- df[df$user %in% df[df$number == 0,1],] 

df1["Status"] <- 0 

#doesn't work 
df1[df1$number == 1 %in% df1[duplicated(df1$user),]] 

什麼,我試圖做的是找到所有重複的用戶,如果數等於1。要嘗試這樣算賬:

df1[df1$number == 1 %in% df1[duplicated(df1$user),]] <- df1$Status == 1 
+2

'days'從哪裏來? ..「一些預定義的數字」不能幫助我們幫助你...並且你的數據是否總是按用戶和數字升序排序? :) –

+1

你可以寫出一個功能,爲一個用戶做你想做的事,然後使用ddply在所有用戶上運行這個功能。 – EDi

+0

我不認識別人,但是我發現很難從你的例子和描述中理解你真正想要的。例如什麼是列「C」或「B」? –

回答

1
#order the dataset by columns needed 
df2 <- df2[order(df2$user, df2$number),] 

ids <- unique(df2$user) 

#create variable status and days 
status <- NULL 
end <- NULL 
for (i in 1:length(ids)) { 
    aux <- df2[df2$user %in% ids[i],] 
    if (nrow(aux) == 1 & aux$number[1] == 0){ 
      status[i] <- 0 
      days[i] <- end 
    } else if (nrow(aux) > 1) { 
      status[i] <- 1 
      days[i] <- aux$Event[2] 
    } else { 
      status[i] <- NA 
      days[i] <- NA 
    } 
} 

#merge the vector created with the database 
data <- data.frame(ids, status, days) 
df2 <- df2[!duplicated(df2$user),] 
df2 <- merge(df2, data, by.x="user", by.y="ids") 

#remove NAs from the dataset 
df.f <- df2[!(is.na(df2$days)),] 
1

也許subseting每一個每一個data.frame用戶不是最有效的方法,但如果您在幾秒鐘內不需要答案,那麼對於您的數據量來說可能會足夠好。

ids = unique(df1$user); 
status.days = sapply(ids,function(id) { 
    udf = subset(df1,subset= user == id); 
    if (nrow(udf) == 1) { 
    status = 0; 
    days = XXX; # the predefined value. 
    } else if (udf$number[2] != 1) { 
    status = 0; 
    days = XXX; # the predefined value; 
    } else { 
    status = 1; 
    days = udf$columnC[2] - udf$columnB[1]; 
    } 
    c(status,days) 
}); 

status = sapply(status.days,simplify=T,function(sd) { sd[1] }); 
days = sapply(status.days,simplify=T,function(sd) { sd[2] }); 

result = data.frame(user=ids,number=rep(0,length(ids)),status=status,days=days) 

我不得不承認,我不知道有關索引中提取狀態和天時間列表「status.days」 ......也許不是SD [1]和SD [2]它應該sd [1] [2]或sd [[1]] [1],sd [[1]] [2]

+0

所以要做這樣的事情:df1 [df1 $ number == 1%in%df1 [duplicated(df1 $ user),]](but working:p ) 不可能? – pavid

+0

說實話,我不知道那個表情會產生什麼。看着你最後的編輯我想你想要的只是唯一的(df1 $ user [df1 $ number == 1])來創建這些用戶的ID。或者,也許你想要他們的數字== 1記錄?在這種情況下,df1 [df1 $ number == 1]。是不是保證,如果數字== 1用戶已經複製(即有更多的行與其ID)? –

+0

在任何情況下,我提供的解決方案都試圖解決現在我認爲理解的最初問題,而無需考慮先前對解決方案的討論。這個解決方案的潛在問題是它可能不是最高效的,但我認爲它對於你的數據量應該足夠好。 –