我是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))
但我有很多,而且正如我所说,每列的数量不同。
有什么建议吗?
由于
答案 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