2016-10-07 18 views
0

如果有一個數據幀:應用不同的功能將數據幀列取決於列名相匹配的模式

l$`__a` <- data.frame(`__ID` = stringi::stri_rand_strings(10, 1), 
col = stringi::stri_rand_strings(10, 1), check.names = F) 

和兩個配套功能:

prefixColABC <- function(dfCol) { 
paste0("ABC_", dfCol) 
} 

prefixColDEF <- function(dfCol) { 
    paste0("DEF_", dfCol) 
} 

如何申請第一功能對於數據幀列名稱盯着__和第二個所有其他列?

爲了解決這個問題,我想我會第一子組中的所有列與開始__名稱,適用prefixColABC給他們,然後子集中的所有其他人,並應用prefixColDEF給他們。然後我會使用cbind()將所有列重新組合到一個數據框中。

下面是我的一些進展:

這裏的第一個功能是如何被應用到所有列:

as.data.frame(apply(l$`__a`, 2, prefixColABC)) 

而這裏的我怎麼能子集的列。所有與列名以__

l$`__a`[ grep(pattern = "^__", l$`__a`), 1 ] 

我不知道如何子集不匹配該模式的所有其他列。我不知道如何設置了適用聲明

我認爲這個問題是相似的礦井內的情況,但不會選擇基於模式匹配的列: R Applying different functions to different data frame columns

回答

2

試試這個假設輸入數據幀稱爲dd

hasPrefix <- grepl("^__", names(dd)) 
dd[, hasPrefix] <- lapply(dd[, hasPrefix, drop = FALSE], prefixColABC) 
dd[, !hasPrefix] <- lapply(dd[, !hasPrefix, drop = FALSE], prefixColDEF) 

,並提供:

> dd 
    __ID col 
1 ABC_G DEF_x 
2 ABC_n DEF_U 
3 ABC_c DEF_G 
4 ABC_O DEF_X 
5 ABC_p DEF_E 
6 ABC_U DEF_j 
7 ABC_M DEF_G 
8 ABC_0 DEF_l 
9 ABC_V DEF_i 
10 ABC_B DEF_u 

注:輸入dd,修改之前,是:

dd <- structure(list(`__ID` = structure(c(4L, 6L, 3L, 7L, 8L, 9L, 5L, 
1L, 10L, 2L), .Label = c("0", "B", "c", "G", "M", "n", "O", "p", 
"U", "V"), class = "factor"), col = structure(c(8L, 7L, 2L, 9L, 
1L, 4L, 2L, 5L, 3L, 6L), .Label = c("E", "G", "i", "j", "l", 
"u", "U", "x", "X"), class = "factor")), .Names = c("__ID", "col" 
), row.names = c(NA, -10L), class = "data.frame") 
+0

你的解決方案是非常有幫助,謝謝!我試圖調整它不覆蓋原始數據框。你能幫我解決嗎?我現在試圖用這種方式創建一個具有相同結構的空數據框:'dd2 < - dd [0,]',然後用'apply'命令的數據填充它,但是我收到了這個錯誤「替換元件1具有10行以替換0行「。我是否應該使用'vapply'來確保我總是獲得一個列向量以插入數據框? – Bobby

+0

我也試着編寫一個函數,它使用你的例子,但它沒有像我期望的那樣返回一個包含兩列的數據框。你有任何關於這個給予的提示嗎? 012f 'processOneDF < - function(dfName){dfName [「__ID」] < - lapply(dfName [,'__ID「,drop = FALSE],prefixColABC) dfName [」col「] < - lapply(dfName [ 「col」,drop = FALSE],prefixColDEF) } l5 < - l l5 $'__a' < - processOneDF(l5 $'__a') – Bobby

相關問題