基本循环问题,尝试添加具有值更改的新列
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)
的结果
我正在尝试查看位置何时连续变化,三个可能的位置是: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)