基本循环问题,尝试添加具有值更改的新列

Basic loop question, trying to add new column with value changes

我正在尝试查看位置何时连续变化,三个可能的位置是:Lower、Misc 和 Upper。每列代表一个月,因此可以有多个检测,如下面的 f 列所示。因此对于下面的示例,d、f 和 h 列中会发生位置更改。我试图将这些更改粘贴到行末尾的新列中。 这是我试过的代码,但是循环不起作用。我 gsub 数字位置的原因是因为循环似乎有单词问题,所以我认为数字可能会使它工作,但它仍然没有。

df= read.csv("C:/Users/Owner/Documents/Mote/TempMovement/test-row.csv")
df

tag  a    b  c  d    e     f       g     h

228 Lower 0 0 Upper 0 Upper,Misc Misc Lower

df$a<-as.character(df$a)
df$b<-as.character(df$b)
df$c<-as.character(df$c)
df$d<-as.character(df$d)
df$e<-as.character(df$e)
df$f<-as.character(df$f)
df$g<-as.character(df$g)
df$h<-as.character(df$h)

df<-gsub("Lower", "1",df)
df<-gsub("Misc", "2", df)
df<-gsub("Upper", "3", df)

for (j in (df)){
if (j+1 == j || "0") {
next
} else {
df$move<-paste(j+1)
}

}

我想要的结果是:

tag  a    b  c  d    e     f       g     h    move

228 Lower 0  0 Upper 0 Upper,Misc Misc Lower  d,f,h

这是一个使用 tidyverse 的解决方案(假设有多行 - 如果实际上只有一行,它可能会更简单;还假设每一行的标签都是唯一的):

require(tidyr)
require(dplyr)
df= read.csv("C:/Users/Owner/Documents/Mote/TempMovement/test-row.csv", 
  stringsAsFactors=FALSE) # avoid the need for as.character
left_join(df,
      df %>% gather("var","val",-1) %>% # create a helper dataframe in a "long" format
          filter(val!=0) %>% # take out the cases with 0
          separate_rows(val) %>% # break apart observations with more than one action
          group_by(tag) %>%
          summarize(move=paste(var[val!=lag(val) & !is.na(lag(val))],collapse=",")), #create a data.frame of all the "move" column
      by="tag") # merge the move column into the original dataframe

结果:

  tag     a b c     d e          f    g     h  move
1 228 Lower 0 0 Upper 0 Upper,Misc Misc Lower d,f,h

如果您不熟悉 gather,请尝试仅查看 df %>% gather("var","val",-1)

的结果