R - 从硬编码脚本移动到函数

时间:2016-08-19 07:47:05

标签: r function

假设我有一个包含2种类型信息(X#和Y#)的数据框。

 String deleteQuerry= "DELETE FROM my_chat WHERE project_id ='"
                    + project_id
                    + "' AND id = (SELECT MAX(id) FROM my_chat)";

我使用两列(X1和Y1下面)将它们分为9个类别(每列分为3个类别,包含1/3或行)并将它们存储在新列cat11中(我为穷人深表歉意)代码我告诉你,但我只是R的初学者。

df = data.frame(matrix(rnorm(600), nrow=100))
colnames(df) <- c("X1", "X2", "Y1", "Y2", "Y3", "Y4")

我现在正在努力做的是运行此代码以选择其他组合(例如X1,Y4&gt; cat14; X2,Y1&gt; cat21; X2,Y3&gt; cat23)。

我一直在尝试使用函数和lapply,但还没有成功。我想我错过了一些明显的东西。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

首先,我创建了X和Y列的所有组合:

combs <- expand.grid(names(df)[grep("X", names(df))],
                     names(df)[grep("Y", names(df))],
                     stringsAsFactors = FALSE)
#  Var1 Var2
#1   X1   Y1
#2   X2   Y1
#3   X1   Y2
#4   X2   Y2
#5   X1   Y3
#6   X2   Y3
#7   X1   Y4
#8   X2   Y4

然后我为你的方法编写了一个矢量化的替代方法,并将其包装在一个函数中:

library(Hmisc)
fun <- function(DF, col1, col2) {
  tmpx <- cut2(df[[col1]], g=3)
  tmpx <- as.integer(tmpx)

  tmpy <- cut2(df[[col2]], g=3)
  tmpy <- as.integer(tmpy)

  (tmpx - 1) * 3 + tmpy #some simple maths
}

请注意我如何使用[[以编程方式提取以字符串形式提供的列。您无法使用$(这是常见问题解答)。研究help("[")

然后我使用mapply将函数应用于所有组合:

df[, paste0("cat", 
            gsub("[[:alpha:]]*", "", combs[,1]),
            gsub("[[:alpha:]]*", "", combs[,2]))] <- mapply(fun, combs[,1], combs[,2], 
                                                             MoreArgs = list(DF = df))

mapply遍历其参数的所有元素并对它们应用函数。例如,该函数应用于X1 / Y1,X2 / Y1,......

最复杂的部分是创建列名。我在这里使用一个简单的正则表达式,只删除combs中给出的列名中的所有字母。