2014-12-13 39 views
0

我的數據集是這樣的:R中創建包含列的前n位的最上一行

group <- c(1,2,3,4,5,6,7) 
    item1.sep <- sample(1:10,7) 
    item2.sep <- sample(1:10,7) 
    item3.sep<- sample(1:10,7) 
    item4.sep<- sample(1:10,7) 
    item5.sep<- sample(1:10,7) 
    item1.oct<- sample(1:10,7) 
    item2.oct <- sample(1:10,7) 
    item3.oct<- sample(1:10,7) 
    item4.oct<- sample(1:10,7) 
    item5.oct<- sample(1:10,7) 

df <- data.frame(group,item1.sep,item2.sep,item3.sep,item4.sep,item5.sep, 
       item1.oct,item2.oct,item3.oct,item4.oct,item5.oct) 


    group item1.sep item2.sep.... item5.oct 
     1  9   9    4 
     2  4   4    7 
     3  7   7    2 
     4  3   8    5 
     5  8   3    1 
     6  6   10    8 
     7  10   2    6 

而且我想創建一個包含前2項作爲字符每個月2個新列。也許max和合並的組合將有助於這一

  Top2_Sept Top2_Oct    group.... item5.oct 
item3.sep,item2.sep item5.Oct,item2.Oct  1   9 
item4.sep,item1.sep  .     2   4   
item2.sep,item5.sep  .     .   . 
item4.sep,item2.sep  .     .   . 
item1.sep,item3.sep  .     .   . 
item2.sep,item5.sep  .     .   . 
item4.sep,item1.sep  .     .   
+0

對不起,我似乎只能接受一個,但你的也是正確的。謝謝。 – jbest 2014-12-20 04:39:17

+1

沒問題。謝謝回覆。 – akrun 2014-12-20 04:39:39

回答

2

這裏有一個data.table解決方案。

library(data.table) 
DT <- as.data.table(df) 
DT[,Top2_Sept:=paste(names(.SD)[order(unlist(.SD),decreasing=TRUE)[1:2]],collapse=","), 
      .SDcols=2:6,by=group] 
DT[,Top2_Oct:=paste(names(.SD)[order(unlist(.SD),decreasing=TRUE)[1:2]],collapse=","), 
      .SDcols=7:11,by=group] 
DT[,list(group,Top2_Sept,Top2_Oct)] 
# group   Top2_Sept   Top2_Oct 
# 1:  1 item5.sep,item3.sep item2.oct,item1.oct 
# 2:  2 item2.sep,item4.sep item1.oct,item5.oct 
# 3:  3 item5.sep,item3.sep item3.oct,item2.oct 
# 4:  4 item4.sep,item1.sep item5.oct,item1.oct 
# 5:  5 item2.sep,item4.sep item4.oct,item5.oct 
# 6:  6 item1.sep,item2.sep item1.oct,item2.oct 
# 7:  7 item1.sep,item2.sep item1.oct,item2.oct 

您的示例不太可重複,因爲您在創建隨機樣本之前沒有set.seed(...)。如果您在開始時使用set.seed(1),上述結果將會重現。

此外,您的規則存在歧義。假設給定行的item1.sep:item5.sep(8,7,7,6,5)。然後,頂部項目在第一列,但第二個項目可能在第二列或第三列。你沒有規則來解決這個問題。

+1

同意使用'st.seed(...)'做出可重複的例子的重要性! – PavoDive 2014-12-13 19:36:31

1

嘗試

lst1 <- split(colnames(df)[-1],sub(".*\\.", '',colnames(df)[-1])) 
df[paste("Top2", c("Oct", "Sept"), sep="_")] <- lapply(lst1, function(x) { 
      nm1 <- colnames(df[x]) 
      apply(df[x], 1, function(.x) 
      toString(nm1[order(.x, decreasing=TRUE)[1:2]]))}) 

或者

lst1 <- lapply(month.abb[9:10], function(x) 
     df[grep(x, colnames(df), ignore.case=TRUE)]) 
nm1 <- lapply(lst1, colnames) 
f1 <- function(x,y) apply(x, 1, function(.x) 
      toString(y[order(.x, decreasing=TRUE)[1:2]])) 

df[paste('Top2', month.abb[9:10], sep="_")] <- Map(f1, lst1, nm1) 
相關問題