使用tidyverse中的多列生成两列

时间:2019-05-17 22:40:26

标签: r dplyr tidyverse

我有以下数据:

df<-read.table(text= "Group Time income
A	1	20
 M	3	14
A	2	11
P	2	22
Q	3	21
Q	1	24
M	2	22
P	2	15",h=T)

我想生成两个如下的类:

所有组的时间1和仅A和M组的时间3。这将生成“类别1”列。

所有组的时间2和仅P和Q组的时间3。这将生成类2的列。 输出为:

Group	Time	Income	Class1	Class2
A	1	20	20	11
M	3	14	24	22
A	2	11	14	22
P	2	22		15
Q	3	21		21
Q	1	24		
M	2	22		
P	2	15		

作为R的新手,我无法找到解决方案。任何帮助都将得到

2 个答案:

答案 0 :(得分:0)

这有点尴尬,因为我们要求T(n) = O(n log(n))按位置连接,当派生列表似乎不再与我们要附加它们的行相对应时。一种实现方法是为原始数据的每一行,派生列表的每一行提供一个list = [1,2,3,4] i = 1 while i in list: i += 1 print(i) ,并基于该dplyr进行left_join。

rowid

在R中,rowid是一个特殊值,它是不具有显式值的数据的占位符。当您要控制是否将丢失的数据包括在计算中或从计算中排除时,它非常方便。如果这是处理的最后一步,并且要输出可读的表,则可以用空的“”字符替换NA,但这会将数据列更改为字符数据,这对于任何进一步的计算都是不便的。

答案 1 :(得分:0)

这是获取输出的一种方法,尽管不清楚Class1和Class2中的值的合理排序是什么。

df<-read.table(text= "Group Time income
A   1   20
 M  3   14
A   2   11
P   2   22
Q   3   21
Q   1   24
M   2   22
P   2   15",h=T)

library(tidyverse)
df %>%
  mutate(
    Class1 = (Time == 1) | ((Time == 3) & Group %in% c("A", "M")),
    Class2 = (Time == 2) | ((Time == 3) & Group %in% c("P", "Q"))
  ) %>%
  mutate_at(
    .vars = vars(Class1, Class2),
    .funs = ~ income[.x] %>% `length<-`(length(.x))
  )
#>   Group Time income Class1 Class2
#> 1     A    1     20     20     11
#> 2     M    3     14     14     22
#> 3     A    2     11     24     21
#> 4     P    2     22     NA     22
#> 5     Q    3     21     NA     15
#> 6     Q    1     24     NA     NA
#> 7     M    2     22     NA     NA
#> 8     P    2     15     NA     NA

reprex package(v0.2.1)于2019-05-17创建