首页 > 解决方案 > R:df 标题列是序数排名,并在每个观察的列中分布

问题描述

我有一份问卷数据,如下所示:

   items no_stars1  no_stars2   no_stars3   average satisfied   bad
1     A         1           0           0         0         0     1
2     B         0           1           0         1         0     0
3     C         0           0           1         0         1     0
4     D         0           1           0         0         1     0
5     E         0           0           1         1         0     0
6     F         0           0           1         0         1     0
7     G         1           0           0         0         0     1

基本上,标题栏(星级和满意的数量)是每个项目的序数排名。我想将 no_stars(col 2:4) 和 compatible(col 5:7) 总结为一列,以便输出如下所示:

   items    no_stars    satisfactory    
1     A         1           1           
2     B         2           2           
3     C         3           3           
4     D         2           3           
5     E         3           2           
6     F         3           3           
7     G         1           1         

$no_stars <- 1 代表 no_stars1,2 代表 no_stars2,3 代表 no_stars3

$satisfactory <- 1 表示差,2 表示一般,3 表示好

我试过下面的代码

df$no_stars2[df$no_stars2 == 1] <- 2
df$no_stars3[df$no_stars3 == 1] <- 3

df$average[df$average == 1] <- 2
df$satisfied[df$satisfied == 1] <- 3

no_stars <- df$no_stars1 + df$no_stars2 + df$no_stars3
satisfactory <- df$bad + df$average + df$satisfied

tidy_df <- data.frame(df$Items, no_stars, satisfactory)
tidy_df

R中是否有任何功能可以做同样的事情?或者有人有更好更简单的解决方案吗?

谢谢

标签: r

解决方案


只需使用max.col并设置首选项:

starsOrder<-c("no_stars1","no_stars2","no_stars3")
satOrder<-c("bad","average","satisfied")
data.frame(items=df$items,no_stars=max.col(df[,starsOrder]),
            satisfactory=max.col(df[,satOrder]))
#  items no_stars satisfactory
#1     A        1            1
#2     B        2            2
#3     C        3            3
#4     D        2            3
#5     E        3            2
#6     F        3            3
#7     G        1            1

推荐阅读