Основной вопрос цикла, пытаясь добавить новый столбец с изменениями значения - PullRequest
0 голосов
/ 04 апреля 2019

Я пытаюсь увидеть, когда местоположение меняется подряд, возможны три местоположения: Нижнее, Разное и Верхнее.Каждый столбец представляет месяц, поэтому может быть несколько обнаружений, как показано ниже в столбце f.Таким образом, для приведенного ниже примера, изменение местоположения произошло бы в столбцах d, f и h.Я пытаюсь вставить эти изменения в новый столбец в конце строки.Это код, который я пробовал, однако цикл не работает.Причина, по которой я gsub'd местоположения для чисел, заключается в том, что цикл, кажется, испытывает проблемы со словами, поэтому я подумал, что числа могут заставить его работать, однако это все еще не работает.

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 голосов
/ 04 апреля 2019

Вот решение с использованием 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)

...