2015-08-30 40 views
3

我有一個數據幀中的每個元素,我想通過使用我寫稱爲「組1」的功能,以變換第一列:ddply /變換不適功能爲一個字符向量

group1 <- function(x) { 
    temp <- strsplit(x,"_")[[1]][2] 
    temp <- gsub("Yellow", "", temp) 
    temp <- gsub("Blue", "", temp) 
    as.numeric(temp) 
} 

對於例如,在字符串「MHY_Blue23_Yellow16_11A」上應用這個函數應該得到結果23.當輸入只是一個字符串時的確如此,但是當我嘗試將這個函數應用於字符向量時,出現了一些問題。我試圖用「改造」,使其每個元素的矢量工作:

data_ling_RT2 <- transform(data_ling_RT, Group1 = group1(Code_Trials))) 

而是獲得一個數據幀有一個名爲「組1」的新列,它取決於各自的元素在「Code_Trials」 ,我得到「Group1」中的所有元素僅基於「Code_Trials」的第一個元素。我想這與我編寫「group1」的方式有關,但我找不到我做錯了什麼。 使用ddply更糟 - 有時甚至在「Group1」列中甚至沒有任何東西...

我非常感謝您的幫助!

回答

1

我們只使用[[1]]選擇第一個list元素。所以,當我們使用transform時,第一個被修改的元素會回收​​到長度。

我們可以通過在執行gsub之前使用sapply提取每個list元素的元素元素來更改group1函數。目前還不清楚爲什麼我們要取代「黃色」,因爲第二個元素似乎只有「藍色」。

group1 <- function(x) { 
    temp <- strsplit(x,"_") 
    temp <- sapply(temp, '[', 2) 
    temp <- gsub("Yellow", "", temp) 
    temp <- gsub("Blue", "", temp) 
    as.numeric(temp) 
} 

上述代碼可以簡化爲

group2 <- function(x) { 
    temp <- strsplit(x,"_") 
     temp <- sapply(temp, '[', 2) 
     temp <- as.numeric(gsub('\\D+', '', temp)) 
    } 

使用可再現的示例

data_ling_RT <- data.frame(Code_Trials= c("MHY_Blue23_Yellow16_11A" , 
     "MHY_Blue24_Yellow16_11A"), stringsAsFactors=FALSE) 
transform(data_ling_RT, Group1 = group1(Code_Trials)) 
#    Code_Trials Group1 
#1 MHY_Blue23_Yellow16_11A  23 
#2 MHY_Blue24_Yellow16_11A  24 
+0

謝謝,akrun!有效。 所以我的謬誤是我有一個列表,並且ddply和轉換不是要在列表元素上工作,而是在數據框上工作。對?我可以讓它和llply一起工作嗎? 另外,你能否解釋'sapply(temp,'[',2)''中的第二個參數? 'gsub('\\ D +','',temp)''中的第一個參數? 非常感謝。 PS - 該函數既包含「黃色」又包含「藍色」,因爲輸入有時具有「藍色」,有時在其第二個參數中具有「黃色」。 – Galit

+0

@Galit'ddply'在data.frame上工作,''llply'在列表上工作,返回輸出也是一個列表。 'sapply(temp,'[',2)'返回每個列表元素的第二個元素,因爲'strsplit'返回一個'list'。 'gsub''\\ D +'匹配所有非數字字符並且替換爲''''。如果這適用於您,請考慮通過點擊投票旁邊的勾號來接受解決方案。 – akrun

+1

謝謝@akrun,我不知道你可以使用'['或'[['作爲* apply中的函數。這真的很有幫助! – Galit

相關問題