R 基于跨列的值创建新变量

R 基于跨列的值创建新变量,r,R,我有一个数据框架,类似于下面的简化版本: MO1<-c("0","1","2","3") MO2<-c("1","0","3","2") MO3<-c("3","2","1","0") df<-data.frame(MO1,MO2,MO3) df MO11)像这样尝试max.col。在每行前面插入1,然后查找最后1的列。减去1,使其与原始列数相对应,缺失的1为0。然后将所有零替换为NA,并查找相应的列名 ix <- max.col(cbind(1, df) ==

我有一个数据框架,类似于下面的简化版本:

MO1<-c("0","1","2","3")
MO2<-c("1","0","3","2")
MO3<-c("3","2","1","0")
df<-data.frame(MO1,MO2,MO3)
df
MO11)像这样尝试
max.col
。在每行前面插入1,然后查找最后1的列。减去1,使其与原始列数相对应,缺失的1为0。然后将所有零替换为NA,并查找相应的列名

ix <- max.col(cbind(1, df) == 1, "last") - 1
transform(df, MOTIVATION = names(df)[replace(ix, ix == 0, NA)])
1)像这样尝试
max.col
。在每行前面插入1,然后查找最后1的列。减去1,使其与原始列数相对应,缺失的1为0。然后将所有零替换为NA,并查找相应的列名

ix <- max.col(cbind(1, df) == 1, "last") - 1
transform(df, MOTIVATION = names(df)[replace(ix, ix == 0, NA)])
另一种选择

> ind <- which(df==1, arr.ind = TRUE)
> df2 <- df   # just cloning df
> df2$MOTIVATION <- NA
> df2$MOTIVATION[ind[,1]] <- names(df) [ind[,2]]
> df2
  MO1 MO2 MO3 MOTIVATION
1   0   1   3        MO2
2   1   0   2        MO1
3   2   3   1        MO3
4   3   2   0       <NA>
>ind-df2-df2$MOTIVATION-df2$MOTIVATION[ind[,1]]df2
MO1 MO2 MO3动机
1013mo2
21102mo1
3.2.3.1 MO3
4   3   2   0       
另一个选项

> ind <- which(df==1, arr.ind = TRUE)
> df2 <- df   # just cloning df
> df2$MOTIVATION <- NA
> df2$MOTIVATION[ind[,1]] <- names(df) [ind[,2]]
> df2
  MO1 MO2 MO3 MOTIVATION
1   0   1   3        MO2
2   1   0   2        MO1
3   2   3   1        MO3
4   3   2   0       <NA>
>ind-df2-df2$MOTIVATION-df2$MOTIVATION[ind[,1]]df2
MO1 MO2 MO3动机
1013mo2
21102mo1
3.2.3.1 MO3
4   3   2   0       

以下就是关键(请注意,这支持两列有“1”的情况,但不确定这是否是您的有效边缘情况。 (我稍微修改了MO4,使其包含两个“1”


MO1以下就是关键(注意,这支持两列中有“1”的情况,但不确定这是否是一个有效的边缘情况。
(我稍微修改了MO4,使其包含两个“1”


MO1一个选项是将
apply
结合使用,后者作为:

df$MOTIVATION <- apply(df,1,function(x)names(df)[which(x==1)])
df
#    MO1 MO2 MO3 MOTIVATION
# 1   0   1   3        MO2
# 2   1   0   2        MO1
# 3   2   3   1        MO3
# 4   3   2   0  

df$MOTIVATION一个选项是将
apply
结合使用,后者作为:

df$MOTIVATION <- apply(df,1,function(x)names(df)[which(x==1)])
df
#    MO1 MO2 MO3 MOTIVATION
# 1   0   1   3        MO2
# 2   1   0   2        MO1
# 3   2   3   1        MO3
# 4   3   2   0  

df$MOTIVATION感谢您的建议,有没有办法限制数据框中哪些列/变量可以查找1s?我还有其他列/变量,其中也有1s。当我运行脚本时,新变量的名称包含所有有1的列/变量。感谢您的建议,有没有办法限制ich数据框中的列/变量,我可以查找1s?我还有其他列/变量,其中也有1s。当我运行脚本时,新变量具有所有包含1的列/变量的名称。
df$MOTIVATION <- apply(df,1,function(x)names(df)[which(x==1)])
df
#    MO1 MO2 MO3 MOTIVATION
# 1   0   1   3        MO2
# 2   1   0   2        MO1
# 3   2   3   1        MO3
# 4   3   2   0