2016-08-20 101 views
0

我是R的初學者,最近經歷了很少的包裝。對於練習課程,我創建了一個包含3欄Part,Claimid和Cost的csv數據集。該數據集看起來如下: -R for字符變量循環

Part Claimid Cost 
Part1 ID1 12 
Part1 ID20 29 
Part2 ID21 21 
Part2 ID40 13 
Part3 ID41 11 
Part3 ID60 10 

成本列1至10 我試圖運行每個部分(這裏是3份)的循環和使用dplyr包來創建三個不同dataframes之間的隨機數

library(dplyr) 
claimid <- read.csv(file.choose(),header = TRUE) 
plist <- unique(claimid$Part) ##Create the number of loops (Here 3) 
    for (i in plist) { 
     plist <- claimid %>% select(Part,Claimid) %>% filter(Part %in% i) 
    } 

我打印plist時得到最後20個觀察值,因爲顯然R保存了循環的最後一次觀察結果。 任何幫助將是偉大的帶我前進。

+0

對於你發佈的問題,我的解決方案回答了它。如果您沒有問題,請點擊表決旁邊的勾號,接受它。 – akrun

回答

0

如果我們使用for循環,我們需要創建一個list來存儲輸出。最好將數據幀保存在list中,而不是三個單獨的data.frame對象。

plist <- unique(claimid$Part) 
lst <- setNames(vector("list", length(plist)), plist) 
for (i in seq_along(plist)) { 
    lst[[i]] <- claimid %>% 
        select(Part,Claimid) %>% 
        filter(Part %in% plist[i]) 
} 

但是,這可以更直接地與lapply

lst1 <- lapply(plist, function(nm) claimid %>% 
             select(Part, Claimid) %>% 
             filter(Part %in% nm) 
        ) 

做然而,如果我們需要創建三個不同的data.frame對象,assign是選項(但不推薦)

for (i in plist) { 
     assign(i, claimid %>% select(Part,Claimid) %>% filter(Part %in% i)) 
    } 


Part1 
# Part Claimid 
#1 Part1  ID1 
#2 Part1 ID20 

Part2 
# Part Claimid 
#1 Part2 ID21 
#2 Part2 ID40 

Part3 
# Part Claimid 
#1 Part3 ID41 
#2 Part3 ID60 
+0

非常感謝「akrun」。我必須學習seq_along函數和分配函數。感謝您幫助像我這樣的初學者。上帝保佑。 –

+0

嗨akrun,如果我使用此代碼claimid < - read.csv(file.choose(),header = TRUE) df < - data.frame(part = character(),totcost = integer(),claim = integer ),stringsAsFactors = FALSE) plist < - unique(claimid $ Part) for(i in plist){ assign(i,claimid%>%filter(Part%in%i)%>%group_by(Part)%> %totreze(totcost = sum(Cost), claim = n_distinct(Claimid))) rbind(df,i) }我可以將數據集Part1,Part2和Part3追加到單個數據集df中嗎? –

+0

@ARIMITRAMAITI如果您從一個數據集開始,我不確定爲什麼要將它分解到不同的數據集。 – akrun

0

如果我用這個代碼`

claimid <- read.csv(file.choose(),header = TRUE) 
df <- data.frame(Part = character(),totcost = integer(),claim = integer(),stringsAsFactors = FALSE) 
plist <- unique(claimid$Part) 
for (i in plist) { assign(i, claimid %>% filter(Part %in% i) %>% group_by(Part) %>% summarise(totcost = sum(Cost), claim = n_distinct(Claimid))) 
rbind(df,i) } 

請問我能夠把數據集第一部分,第2部分第3部分,並在單個數據集DF一起追加?