假设我有一个包含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,但还没有成功。我想我错过了一些明显的东西。
非常感谢任何帮助。
答案 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
中给出的列名中的所有字母。