R-根据条件选择列

时间:2019-03-21 19:03:33

标签: r function dplyr purrr

我正在尝试找到一种简单的方法,可以根据条件({}来从数据集中选择不同的列(db$Item1db$Item2db$Item3db$Item4) {1}})。最好使用dplyr。这是一个可复制的示例。

db$Scale

简要说明:我有一个数据集,具有三个不同的标度(1、2和3),每个标度都有不同数量的项目。规模1由4个项目组成,规模2由4个项目组成,规模3由3个项目组成。

Scale <- c(1, 1, 1, 2, 2, 3, 3)
Item1 <- c(4, 5, 4, 6, 7, 7, 6)
Item2 <- c(2, 3, 6, 3, 4, 5, 4)
Item3 <- c(6, 7, 3, 4, 5, 6, 5)
Item4 <- c(2, 5, 3, 5, 2, NA, NA)

db <- data.frame(Scale, Item1, Item2, Item3, Item4)

我需要做的是创建一个新数据集(例如:# Scale Item1 Item2 Item3 Item4 #1 1 4 2 6 2 #2 1 5 3 7 5 #3 1 4 6 3 3 #4 2 6 3 4 5 #5 2 7 4 5 2 #6 3 7 5 6 NA #7 3 6 4 5 NA ),为此,我拥有旧列db.X(新名称:Scale),然后新列Scale.X由比例1和2的Item1.X列下的值和比例3的Item 1列下的值组成。此外,我想报告新列Item 3

下的db$Item3
Item2.X

2 个答案:

答案 0 :(得分:1)

这就是您要寻找的东西

db %>%
  mutate(Scale.X = Scale) %>%
  mutate(Item1.X = ifelse(Scale == 1, Item1, Item2),
         Item2.X = Item3) %>%
  select(Scale.X, Item1.X, Item2.X)
  Scale.X Item1.X Item2.X
1       1       4       6
2       1       5       7
3       1       4       3
4       2       3       4
5       2       4       5
6       3       5       6
7       3       4       5

答案 1 :(得分:1)

使用data.table-

setDT(db)
db[,Item1.x:=ifelse(Scale == 1, Item1, Item2)]
setnames(db,c("Scale","Item3"),c("Scale.x","Item2.x"))
db <- db[,.(Scale.x,Item2.x,Item1.x)]

输出-

> db
   Scale.x Item2.x Item1.x
1:       1       6       4
2:       1       7       5
3:       1       3       4
4:       2       4       3
5:       2       5       4
6:       3       6       5
7:       3       5       4