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

时间:2019-04-04 16:23:20

标签: r loops gsub

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

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

1 个答案:

答案 0 :(得分:0)

这是使用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)的结果