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