根据与模式匹配的列名称,将不同的函数应用于数据框列

时间:2016-10-07 21:51:30

标签: r

给定数据框:

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 ]

我不知道如何将所有其他与此模式不匹配的列进行子集化。我不知道如何在apply语句中设置条件

我认为这个问题与我的相似,但不会根据匹配模式选择列: R Applying different functions to different data frame columns

1 个答案:

答案 0 :(得分: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")