2017-03-29 114 views
1

我對R和Rstudio非常陌生。我想要做的是循環一個csv文件。循環播放csv文件

該文件有3列。 1)用戶2)事件(成功或失敗)3)randNum

因此,基本上每個用戶都以失敗開始,一旦他們取得成功,就會轉移到下一個用戶。

例:

user: | event: | randNum 

user1 | fail | 6 

user1 | fail | 4 

user1 | fail  | 1 

user1 | success | 2 

user2 | ...  | 

基本上我需要做的就是這個。我需要存儲第一個隨機數(6),而不是最後一個隨機數(2),每當用戶成功時都會存在。我會怎麼做?我需要爲每個用戶做這件事,因爲我會用這些數字做些事情。

+0

的成功,如果每個用戶最終成功,你可以只計算行數每個用戶。如果使用library(data.table)並使用fread讀取csv(例如dt),則語法爲dt [,.N,by = user]。 –

+0

好的,但是我怎麼會循環遍歷表格來檢查新用戶何時出現? – jim

+1

我不確定你需要循環訪問CSV文件。獲得所有用戶的列表以及失敗次數是否可以接受? –

回答

3

最快的方法是使用table獲得數:

table(df$user) 

示例代碼:

> df <- data.frame(user=c(rep("john",4),rep("jane",3)), event=c(rep("failed",3), "success", rep("failed",2), "success")) 
> df 
    user event 
1 john failed 
2 john failed 
3 john failed 
4 john success 
5 jane failed 
6 jane failed 
7 jane success 
> table(df$user) 

jane john 
    3 4 

編輯:爲了解決您做出大幅度修改的問題最近編輯:

> df <- data.frame(user=c(rep("john",4),rep("jane",3)), event=c(rep("failed",3), "success", rep("failed",2), "success"), randNum=c(4,6,1,2,9,3,5)) 

> library(dplyr) 

> df <- df %>% group_by(user) %>% mutate(trial = 1:n()) 

> df[df$trial==1 | df$event=="success",] 
Source: local data frame [4 x 4] 
Groups: user [2] 

    user event randNum trial 
    <fctr> <fctr> <dbl> <int> 
1 john failed  4  1 
2 john success  2  4 
3 jane failed  9  1 
4 jane success  5  3 
+0

這是否通過表循環? – jim

+0

是的。我添加了示例代碼來說明行爲。 – Vince

+0

這並不回答這個問題,它只是打印每個用戶的元組數量 – jim

1

如果每個用戶最終成功並且想要con代爾每個用戶的第一個和最後一行嘗試下面的代碼:

df<-split(df,df$user) 
df<-lapply(df,function(x){ 
    x<-rbind(head(x,1),tail(x,1)) 
    x 
}) 

df<-do.call("rbind",df) 

這個,你會得到第一個失敗和每個用戶

+0

這是出於某種原因在整個表的第一行和最後一行給每個用戶提供了事件和randNum – jim

+0

@jim是的,head()和tail()函數會給你每個用戶的第一行和最後一行。這不是你需要的嗎?只要舉一個你需要的輸出的例子。 –

+0

好的謝謝你!對不起,這只是一個愚蠢的錯誤,我正在做...這是我需要的 – jim