繁体   English   中英

r:操作数据,使具有相同值的列以特定方式组合

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM