我的R数据框的标题包括Forward,Backward,SideLeft,SideRight,我尝试创建的新列是Direction列。
列以TRUE / FALSE值开头,我将TRUE值转换为标题名称,并将它们全部转换为字符。
df[df==TRUE] <- colnames(df)[which(df==TRUE, arr.ind=TRUE)[,'col']]
以下是数据框的样子:
> df
For Back SLeft SRight Direction
1 For FALSE FALSE FALSE FALSE
2 FALSE FALSE SLeft FALSE FALSE
3 FALSE Back FALSE FALSE FALSE
4 FALSE FALSE FALSE SRight FALSE
我想要制作的内容:
> df
For Back SLeft SRight Direction
1 For FALSE FALSE FALSE For
2 FALSE FALSE SLeft FALSE SLeft
3 FALSE Back FALSE FALSE Back
4 FALSE FALSE FALSE SRight SRight
使用此代码:
for (i in df){
for (index in 1:length(i)){
if (i[index]!="FALSE"){
df$Direction[i] = i[index]
}
}
}
我得到的是什么:
> df
For Back SLeft SRight Direction
1 For FALSE FALSE FALSE FALSE
2 FALSE FALSE SLeft FALSE FALSE
3 FALSE Back FALSE FALSE FALSE
4 FALSE FALSE FALSE SRight FALSE
第一篇文章,怜悯我的描述/编辑
答案 0 :(得分:1)
我们可以使用行/列索引来提取值。列索引派生自max.col
,cbind
带行索引,提取值并指定它以创建'方向'
df$Direction <- df[1:4][cbind(seq_len(nrow(df)), max.col(df[1:4] != FALSE, 'first'))]
df
# For Back SLeft SRight Direction
#1 For FALSE FALSE FALSE For
#2 FALSE FALSE SLeft FALSE SLeft
#3 FALSE Back FALSE FALSE Back
#4 FALSE FALSE FALSE SRight SRight
如果它只是一个逻辑矩阵,那么创建列索引的max.col
也会起作用并且更快
df$Direction <- names(df)[1:4][cbind(seq_len(nrow(df)), max.col(df[1:4], 'first'))]
答案 1 :(得分:1)
数据框列必须具有类,如数字,字符,因子或逻辑。你有很好的逻辑类列,你应该保持这种方式!
“我将TRUE值转换为标题名称,并将它们全部变为” - 这是一个非常糟糕的主意。不要这样做,其余的都很容易。 FALSE
和TRUE
非常有用,具有良好的逻辑价值。作为字符,"FALSE"
和"TRUE"
更难以使用,并且当它们的行为不像逻辑时会引起混淆。
如果您仍有TRUE
和FALSE
,那么您的解决方案就是
df$Direction = names(df)[apply(df, 1, which)]
答案 2 :(得分:1)
transform(df,Direction=df[(s<-which((df!=F),T))[order(s[,1]),]])
For Back SLeft SRight Direction
1 For FALSE FALSE FALSE For
2 FALSE FALSE SLeft FALSE SLeft
3 FALSE Back FALSE FALSE Back
4 FALSE FALSE FALSE SRight SRight