使用其他列中的值在R数据框中创建新列

时间:2018-02-02 17:32:22

标签: r dataframe

我的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

第一篇文章,怜悯我的描述/编辑

3 个答案:

答案 0 :(得分:1)

我们可以使用行/列索引来提取值。列索引派生自max.colcbind带行索引,提取值并指定它以创建'方向'

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值转换为标题名称,并将它们全部变为” - 这是一个非常糟糕的主意。不要这样做,其余的都很容易。 FALSETRUE非常有用,具有良好的逻辑价值。作为字符,"FALSE""TRUE"更难以使用,并且当它们的行为不像逻辑时会引起混淆。

如果您仍有TRUEFALSE,那么您的解决方案就是

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