【问题标题】:Change values in multiple columns with unique value and merge into single column (R)更改具有唯一值的多列中的值并合并为单列 (R)
【发布时间】:2019-03-15 22:27:31
【问题描述】:

假设我有一个包含 4 行和 3 个变量的数据集 (ds),如下所示:

ds
x1  x2  x3
 1   0   0
 0   0   1
 0   1   0
 0   0   1

如何将“1”更改为每列的唯一值并将它们组合成一列?

所以,第一步:

x1  x2  x3
 1   0   0
 0   0   3
 0   2   0
 0   0   3

然后,第二步(创建x4):

x1  x2  x3  x4
 1   0   0   1
 0   0   3   3
 0   2   0   2
 0   0   3   3

我有比这更多的变量,我只是想知道如何最小化我写的行数,所以它不像 10+ 行。

【问题讨论】:

  • 这几乎肯定是个坏主意; x1..x3 看起来像底层分类变量 x4 的虚拟变量/单热变量。这听起来像是一个 [XY 问题[(meta.stackexchange.com/questions/66377/what-is-the-xy-problem)。你能解释为什么你需要这样做吗?您总是可以将每组假人改回它们的分类变量。
  • 所以记录数据的方式有问题。因此,对于从 1 到 7 的单项测量,每个值都用它自己的列记录。因此,任何以 3 为响应的人在第三列被计为 1,在第六列的响应为 6 作为 1,依此类推。所以我需要将它们全部折叠到具有适当值的单列中。
  • Daniel:这不是“如何记录数据的问题”,这是一种非常标准的技术(单热/虚拟变量编码)。 (例如,如果信息来自多选表格/调查/网络表格)。所以你只是问“如何在数据帧列中反转'one-hot'编码?”
  • smci:是的,谢谢,我现在才意识到,在与数据集的原始所有者交谈后,他们没有意识到这是他们所做的。这是一个“问题”,因为那不是故意的。但是,是的,非常感谢您让我知道它的技术术语。

标签: r data-cleaning


【解决方案1】:

你可以这样做:

df <- read.table(text="x1  x2  x3
1   0   0
0   0   1
0   1   0
0   0   1", header=TRUE, stringsAsFactors=FALSE)

df <- df*col(df)
df$x4 <- rowSums(df)

  x1 x2 x3 x4
1  1  0  0  1
2  0  0  3  3
3  0  2  0  2
4  0  0  3  3

【讨论】:

  • 如果数据框太大(百万行),则可以将df &lt;- df*col(df)替换为df &lt;- sweep(x = df, MARGIN = 2, STATS = t(1:ncol(df)), FUN = '*')以提高内存效率。此外,如果在任何给定行中有多个非零值,最后一行代码也会有问题,因为它返回每一行的总和。 OP 需要决定预期的结果是什么。
猜你喜欢
  • 1970-01-01
  • 2018-10-08
  • 2020-03-16
  • 1970-01-01
  • 1970-01-01
  • 2021-07-22
  • 2022-11-02
  • 2019-10-02
  • 1970-01-01
相关资源
最近更新 更多