标题比较罗word,但我的问题很难用一个摘要来解释,因此我准备了一个可复制的示例。以下是我的数据框的子集:
> zed
possessionName possessionMarket
1 Eagles Boston College
2 Blue Devils Duke
3 <NA> <NA>
4 Blue Devils Duke
5 Eagles Boston College
6 Blue Devils Duke
7 Blue Devils Duke
8 Eagles Boston College
9 Eagles Boston College
10 Eagles Boston College
11 <NA> <NA>
12 Blue Devils Duke
13 Blue Devils Duke
14 <NA> <NA>
15 Eagles Boston College
> dput(zed)
structure(list(possessionName = c("Eagles", "Blue Devils", NA,
"Blue Devils", "Eagles", "Blue Devils", "Blue Devils", "Eagles",
"Eagles", "Eagles", NA, "Blue Devils", "Blue Devils", NA, "Eagles"
), possessionMarket = c("Boston College", "Duke", NA, "Duke",
"Boston College", "Duke", "Duke", "Boston College", "Boston College",
"Boston College", NA, "Duke", "Duke", NA, "Boston College")), class = "data.frame", row.names = c(NA,
15L))
这是我正在寻找的输出:
> zed
possessionName possessionMarket outputCol
1 Eagles Boston College 1
2 Blue Devils Duke 1
3 <NA> <NA> 0
4 Blue Devils Duke 0
5 Eagles Boston College 1
6 Blue Devils Duke 1
7 Blue Devils Duke 0
8 Eagles Boston College 1
9 Eagles Boston College 0
10 Eagles Boston College 0
11 <NA> <NA> 0
12 Blue Devils Duke 1
13 Blue Devils Duke 0
14 <NA> <NA> 0
15 Eagles Boston College 1
问题:我希望newCol中的第一行为1。对于所有后续行,== 1
如果学校名称从一行更改为另一行,我希望该值为。例如,第1Eagles
行是Blue Devils
,第2行是,因此第2行的列中应有1 newCol
。
在存在的情况下,我希望该行为零。
请注意,即使存在NA,第2-4行的学校名称也不会改变,因此第4行== 0
。但是,在第10-12行中,数据从Eagles到Blue Devils(尽管中间有一个NA),所以第12行应为1。
通常我会按照以下方式做一些事情:
zed <- zed %>%
dplyr::mutate(newCol = ifelse(possessionName[2:length(possessionName)] != possessionName[1:(length(possessionName)-1)], 1, 0))
...但是由于NA的存在,这种方法被挫败了。我有更好的办法解决这个问题吗?我正在为此积极努力,希望在发布答案之前先发布答案,但可以使用一些帮助。提前致谢 !!!
一种方法是使用from并NA
用之前的NA
s填充s并进行比较na.locf
zoo
library(zoo)
zed$possessionName <- na.locf(zed$possessionName)
zed$output_col <- c(1, +(zed$possessionName[-1] != zed$possessionName[-nrow(zed)]))
zed
# possessionName possessionMarket output_col
#1 Eagles Boston College 1
#2 Blue Devils Duke 1
#3 Blue Devils <NA> 0
#4 Blue Devils Duke 0
#5 Eagles Boston College 1
#6 Blue Devils Duke 1
#7 Blue Devils Duke 0
#8 Eagles Boston College 1
#9 Eagles Boston College 0
#10 Eagles Boston College 0
#11 Eagles <NA> 0
#12 Blue Devils Duke 1
#13 Blue Devils Duke 0
#14 Blue Devils <NA> 0
#15 Eagles Boston College 1
但是由于您正在使用,tidyverse
我们可以使用fill
和lag
library(tidyverse)
zed %>%
fill(possessionName) %>%
mutate(output_col = c(1, +(possessionName != lag(possessionName))[-1]))
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句