我正在尝试查看位置连续更改的时间,三个可能的位置是:下,杂项和上。每列代表一个月,因此可以在下面的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
答案 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)
的结果