在具有特定名称

时间:2016-07-21 17:50:42

标签: r

我是R.的新人 我有数百个像这样的数据框

ID  NAME    Ratio_A Ratio_B Ratio_C Ratio_D
AA  ABCD    0.09    0.67    0.10    0.14
AB  ABCE    0.04    0.85    0.04    0.06
AC  ABCG    0.43    0.21    0.54    0.14
AD  ABCF    0.16    0.62    0.25    0.97
AF  ABCJ    0.59    0.37    0.66    0.07

这只是一个例子。 Ratio_列的数量和名称在数据框之间有所不同,但所有列都以Ratio_开头。我想将一个函数(例如,log(x))应用于Ratio_列,而不指定列号或整个名称。

我知道如何用df来做,对于示例中的那个:

A <- function(x) log(x)
df_log<-data.frame(df[1:2], lapply(df[3:6], A))

但我有很多,而且正如我所说,每列的数量不同。

有什么建议吗?

由于

2 个答案:

答案 0 :(得分:1)

将数据集放在list中,然后循环遍历list元素

lapply(lst, function(x) {i1 <- grep("^Ratio_", names(x));
                         x[i1] <- lapply(x[i1], A)
                          x})

注意:不使用外部包。

数据

lst <- mget(paste0("df", 1:100))

答案 1 :(得分:1)

使用dplyr包很容易处理这类问题。例如,

df <- read.table(text = 'ID  NAME    Ratio_A Ratio_B Ratio_C Ratio_D
                         AA  ABCD    0.09    0.67    0.10    0.14
                         AB  ABCE    0.04    0.85    0.04    0.06
                         AC  ABCG    0.43    0.21    0.54    0.14
                         AD  ABCF    0.16    0.62    0.25    0.97
                         AF  ABCJ    0.59    0.37    0.66    0.07', 
                 header = TRUE)

library(dplyr)

df_transformed <- mutate_each(df, funs(log(.)), starts_with("Ratio_"))

df_transformed
# > df_transformed
# ID NAME    Ratio_A    Ratio_B    Ratio_C     Ratio_D
# 1 AA ABCD -2.4079456 -0.4004776 -2.3025851 -1.96611286
# 2 AB ABCE -3.2188758 -0.1625189 -3.2188758 -2.81341072
# 3 AC ABCG -0.8439701 -1.5606477 -0.6161861 -1.96611286
# 4 AD ABCF -1.8325815 -0.4780358 -1.3862944 -0.03045921
# 5 AF ABCJ -0.5276327 -0.9942523 -0.4155154 -2.65926004