我正在尝试找到一种简单的方法,可以根据条件({}来从数据集中选择不同的列(db$Item1
,db$Item2
,db$Item3
,db$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
答案 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