2016-12-29 23 views
0

的數據幀的一個細胞我有一個列表內許多數據幀的列表的只有一個成員,該列表內的數據幀中的一個是以下之一:選擇是R中

structure(list(`res.log[[i]]` = list("11", "8", c("7", "u"), 
    "11", "7", "4", "1", "6", "u", c("1", "7"), "1", "u", "u", 
    "u", c("20", "11", "18", "17"), "7", "10", "10", "2", "17", 
    c("1", "7"), "7", "14", "u", "7", c("4", "u"), c("1", "7" 
    ), "7", "2", "10", "20", "8", "4", "7"), `as.factor(test.folds.trimmed[[i]]$tp)` = structure(c(3L, 
14L, 12L, 14L, 6L, 10L, 9L, 11L, 8L, 14L, 3L, 7L, 12L, 2L, 11L, 
2L, 14L, 5L, 14L, 1L, 1L, 12L, 12L, 14L, 7L, 10L, 12L, 4L, 4L, 
12L, 14L, 13L, 10L, 9L), .Label = c("1", "10", "11", "14", "17", 
"18", "2", "20", "22", "4", "6", "7", "8", "u"), class = "factor")), .Names = c("res.log[[i]]", 
"as.factor(test.folds.trimmed[[i]]$tp)"), row.names = c(NA, -34L 
), class = "data.frame") 

的數據框本身的單元是'列表'數據類型。正如你在第一列中看到的,一些單元格有2或3個值。 對於第一列中具有多個值的單元格,我想要做的是我只想選擇與第二列中的相應行相等的值。如果它們中的任何一個都不等於第二列中相應單元格中的值,那麼隨機選取一個,哪一個都不重要,它可以始終是第一個,這並不重要,它們中的任何一個都可以被採用。

例如,在下圖中,您可以看到上述數據集的一部分。我想要做的是,對於第一列第三行,我只會保留「7」,因爲它等於第三行第二列的值。然後在第十行和第十五行,我選擇哪一個並不重要,其中任何一個都可以選擇。

Data objects screenshot

我寫的代碼是這樣的,但它的工作原理很奇怪。它將第一列中的所有值更改爲第一個值!

for(FOLDS in 1){ 
    for(rows in 1:nrow(res.log[[FOLDS]])){ 
    if(any(res.log[[FOLDS]][,1][[rows]] == 
res.log[[FOLDS]][,2][[rows]])) res.log[[FOLDS]][,1][[rows]] <- 
      c(res.log[[FOLDS]][,1][[rows]][which(res.log[[FOLDS]][,1][[rows]] == 
res.log[[FOLDS]][,2][[rows]])]) 
    } 
} 

回答

0

這個怎麼樣,使用for循環,你的數據在dat

dat[,3] <- 0 #initialize a new column to check 

for(i in 1:nrow(dat)){ 
    if(length(unlist(dat[i,1])) > 1){ 
     if(any(unlist(dat[i,1]) == dat[i,2])){ 
      dat[i,3] <- as.character(dat[i,2]) 
     }else{ 
      dat[i,3] <- as.character(sample(unlist(dat[i,1]), 1)) 
     } 
    }else{ 
     dat[i,3] <- as.character(dat[i,1]) 
    } 
} 

dat[c(3, 6:10),] 
    res.log[[i]] as.factor(test.folds.trimmed[[i]]$tp) V3 
3   7, u          7 7 
6    4          4 4 
7    1         22 1 
8    6          6 6 
9    u         20 u 
10   1, 7          u 1 

我們首先檢查是否在第一列的列表中有length > 1。如果它的length > 1,我們然後檢查第一列中的列表中的值是否與第二列的值相匹配any。如果匹配,我們存儲第二列的值。如果沒有匹配,我們sample第一列中的一個項目。如果它的length == 1,我們只是將值存儲在第一列。然而,我不完全確定這個解決方案有多快。

+0

神奇。像沒有缺陷的魅力一樣工作。謝謝! – Zideg

-1
# renamed the columns to simplify the work! 
colnames(df)= letters[1:2] 

# another concised approach of 'for-loop' 
df$c <- apply(df, 1, function(x) unlist(x$a)[match(x$b,unlist(x$a), nomatch = 1)]) 

# approach 2.  
func <- function(i) { 
    y<-unlist(df$a[i]); 
    z<-y[y==df$b[i]]; 
    ifelse(length(z)==0, y[1], z) 
} 
# iterate through each row and apply the function  
df$c <- sapply(1:nrow(df), func) 
+0

這是爲什麼,用戶不表示禮貌給出downvote的原因! –

+0

@Zideg是否回答你的問題? –