R-选择列值取决于另一列的值

时间:2019-08-06 08:56:34

标签: r select

我在R中有一个大数据框。 我想基于其他列的值从一组列中合并/选择值。 我有这样的结构:

set.seed(45)
df <- data.frame(Other.Variables = sample(5),
                 A.1 = sample(5),
                 A.2 = sample(5),
                 B.1 = sample(5),
                 B.2 = sample(5),
                 C.1 = sample(5),
                 C.2 = sample(5),
                 Category = as.factor(c("A","B","A","C","B")))
df
  Other.Variables A.1 A.2 B.1 B.2 C.1 C.2 Category
1               4   2   2   3   1   1   2        A
2               2   1   4   4   2   4   5        B
3               1   5   1   1   4   3   4        A
4               3   4   3   5   3   2   3        C
5               5   3   5   2   5   5   1        B

类别是一个具有值(A,B,C等)的因素。

我的输出应该是

  Other.Variables  1  2 Category
1               4  2  2        A
2               2  4  2        B
3               1  5  1        A
4               3  2  3        C
5               5  2  5        B

具有A.1,B.1或C.1等值,具体取决于Category的值。 列名称实际上包含点之前“类别”中的名称。

我一直在尝试使用dplyr进行此操作,因为我的大部分代码都使用dplyr和管道运算符,但是我也愿意接受其他选择。

[编辑]我试图给出一个关于我拥有哪种数据的更说明性的例子。 问题是类别有20个不同的值,每个类别有15列。

1 个答案:

答案 0 :(得分:0)

我实际上已经为自己的问题找到了dplyr解决方案。诀窍是使用一些收集和扩展,最后使用过滤器,从宽到长然后再回到宽格式。当然,也可以使用tydiverse之外的其他重塑功能来完成此操作。

这是我的解决方法:

df %>% 
+   gather(v, value, A.1:C.2) %>% 
+   separate(v, c("var", "col")) %>% 
+   spread(col, value) %>%
+   filter(Category == var) %>%
+   select(-var)

  Other.Variables Category 1 2
1               1        A 5 1
2               2        B 4 2
3               3        C 2 3
4               4        A 2 2
5               5        B 2 5

也许可以帮助遇到类似问题的人。