【发布时间】:2017-09-12 02:53:07
【问题描述】:
我正在执行一个相当复杂的线性回归,其中涉及使用 for 循环有条件地在新列中创建虚拟变量。到目前为止,我一直在几个数据帧中这样做,将它们转换为矩阵,然后将它们转换为稀疏矩阵,然后加入;但是,我已经达到了计算机的极限。抱歉,如果这让您感到困惑 - 我已尝试尽可能简化流程。
编辑 - 将所有数字示例添加到原始问题。
这里是所有数值的源数据:
df <- data.frame(matrix(nrow = 9, ncol = 4))
df$X1 <- c(5, 1, 2, 0, 4, 8, 7, 6, 0)
df$X2 <- c(10001, 10001, 10001, 10003, 10003, 10003, 10002, 10002, 10002)
df$X3 <- c(10002, 10002, 10002, 10001, 10001, 10001, 10003, 10003, 10003)
df$X4 <- c(10001, 10001, 10001, 10003, 10003, 10003, 10002, 10002, 10002)
names(df) <- c("response", "group_1", "group_2", "exclude")
看起来像什么:
response group_1 group_2 exclude
1 5 10001 10002 10001
2 1 10001 10002 10001
3 2 10001 10002 10001
4 0 10003 10001 10003
5 4 10003 10001 10003
6 8 10003 10001 10003
7 7 10002 10003 10002
8 6 10002 10003 10002
9 0 10002 10003 10002
源数据(请参阅上面的编辑):
df <- data.frame(matrix(nrow = 9, ncol = 4))
df$X1 <- c(5, 1, 2, 0, 4, 8, 7, 6, 0)
df$X2 <- c("blue", "blue", "blue", "yellow", "yellow", "yellow", "green", "green", "green")
df$X3 <- c("green", "green", "green", "blue", "blue", "blue", "yellow", "yellow", "yellow")
df$X4 <- c("blue", "blue", "blue", "yellow", "yellow", "yellow", "green", "green", "green")
names(df) <- c("response", "group_1", "group_2", "exclude")
这是数据的简化版本:
response group_1 group_2 exclude
1 5 blue green blue
2 1 blue green blue
3 2 blue green blue
4 0 yellow blue yellow
5 4 yellow blue yellow
6 8 yellow blue yellow
7 7 green yellow green
8 6 green yellow green
9 0 green yellow green
从上面的数据中,我使用以下函数找到了“group_1”和“group_2”中的唯一变量:
fun_names <- function(x) {
row1 <- unique(x$group_1)
row2 <- unique(x$group_2)
mat <- data.frame(matrix(nrow = length(row1) + length(row2), ncol = 1))
mat[1] <- c(row1, row2)
mat_unique <- data.frame(mat[!duplicated(mat[,1]), ])
names(mat_unique) <- c("ID")
return(mat_unique)
}
df_unique <- fun_names(df)
这将返回以下数据框:
ID
1 blue
2 yellow
3 green
然后,对于每种颜色(“ID”),如果颜色在每一行中并且颜色与“排除”列值不匹配,我将创建一个值为 1 的新列。循环如下所示:
for(name in df_unique$ID) {
df[paste(name)] <-
ifelse(df$group_1 == name & df$exclude != name |
df$group_2 == name & df$exclude != name, 1, 0)
}
运行此循环会返回最终的data.frame,如下所示:
编辑 这是最终df的数值数据:
response group_1 group_2 exclude 10001 10003 10002
1 5 10001 10002 10001 0 0 1
2 1 10001 10002 10001 0 0 1
3 2 10001 10002 10001 0 0 1
4 0 10003 10001 10003 1 0 0
5 4 10003 10001 10003 1 0 0
6 8 10003 10001 10003 1 0 0
7 7 10002 10003 10002 0 1 0
8 6 10002 10003 10002 0 1 0
9 0 10002 10003 10002 0 1 0
这是原始数据:
response group_1 group_2 exclude blue yellow green
1 5 blue green blue 0 0 1
2 1 blue green blue 0 0 1
3 2 blue green blue 0 0 1
4 0 yellow blue yellow 1 0 0
5 4 yellow blue yellow 1 0 0
6 8 yellow blue yellow 1 0 0
7 7 green yellow green 0 1 0
8 6 green yellow green 0 1 0
9 0 green yellow green 0 1 0
所以,我的问题是:如果原始数据是矩阵(而不是数据框),我该如何执行这个循环?由于循环正在修改数据框,因此我需要将该数据框转换为矩阵,以便将其转换为稀疏矩阵 - 这种 data.frame 到 data.matrix 的转换对我的机器来说过于密集。
在上面的for 循环之前,我已将代码中的所有内容转换为矩阵表示法,但我无法弄清楚如何在修改 R 中的矩阵(而不是数据框)时以这种方式打印新列)。基本上,我希望有人可以帮助我修改for 循环,以便它可以在矩阵上工作。有人有什么建议吗?
编辑
我忘了提到源数据需要保留它的分组 -
group_by(response, group_1, group_2, exclude)。此外,df 对象需要以矩阵形式开始,以消除data.frame 到data.matrix 的转换。
EDIT2
我没有提到这一点,但是在我运行整个过程之前,所有数据都被索引并转换为数值。所以示例中的df 对象实际上只是数字。
【问题讨论】:
-
转换为矩阵会将所有数字对象呈现为字符类型。你想要那个吗?为什么需要群组信息?
-
我有一个额外的步骤,在将所有数据设为矩阵之前将其逐项列出并将其转换为数字(它保存在另一个数据框中,因此我可以在执行回归后将其转换回来)。我将在编辑中指定。很抱歉造成混乱。
-
我可能错了,因为我不太确定您的用例,但
factor变量被单热编码以获取numeric功能,factor变量已从数据中删除因为信息被新编码的变量捕获。 -
如果您的数据全是数字(整数?),请提供全数字数据的示例。
-
已添加。当我最初提交时,我应该意识到这一点。我应该只提交一个新的提交吗?这越来越长了。
标签: r matrix dataframe data.table sparse-matrix