[英]r: Manipulate data so that columns with same values combine in particular ways
我有一个 dataframe ,其中每一列由零和一个其他数字组成。 例如:
我想操纵 dataframe 使包含相同其他数字的列成为一列,如果每行中都存在其他数字,则该值保持为另一个数字,否则它变为零。
例如,我希望上面的 dataframe 看起来像
..1 ..2 ..3
1 2 3
0 2 0
0 0 0
1 0 0
dataframe 的第一行是 1,因为原始的第一行中的值都是 1。 第一列的第二行是 0,因为该行中有一个 1 和一个 0。
以下是一些可重现的数据:
structure(list(...1 = c(1, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), ...2 = c(1, 0,
0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0, 0, 1, 0, 0, 1, 0, 0, 0,
0, 0, 0, 0, 0), ...3 = c(2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
2, 2, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), ...4 = c(3,
0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0, 0, 0, 3, 0, 0, 3, 0, 0,
0, 0, 0, 0, 0, 0), ...5 = c(3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0), ...6 = c(3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 3, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0)), row.names = c(NA,
-28L), class = "data.frame")
这是基础 R 中的一个可能解决方案,其中dat
是您在问题中提供的数据框。 我们找到每一列的唯一值,假设每一列中只有一个非零值。 然后,我们遍历具有每个唯一值的列组,将 function all()
应用于子集 dataframe 的每一行以识别具有所有非零值的行。 将结果逻辑向量乘以值本身以获得所需的结果。 然后将此向量存储在列表中并绑定到数据框。
col_vals <- apply(dat, 2, max)
columns <- list()
for (val in unique(col_vals)) {
columns[[length(columns) + 1]] <- val * apply(dat[, col_vals == val, drop = FALSE], 1, all)
}
as.data.frame(do.call(cbind, columns))
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.