我正在尝试基于现有字段创建一个新字段。基本上,如果现有字段中的行包含以#开头的字符串,请将该行中的值用作新字段中的行。如果不是,请在新字段的该行中使用现有字段中的最新值(带有#)。
抱歉,这听起来令人困惑,这是一个例子:
df = data.frame(V1 = c("#text1", 1, 3, 4, "#text2", 2, 4, 3, "#text3"),
stringsAsFactors = FALSE)
df_desired = data.frame(V1 = c("#text1", 1, 3, 4, "#text2", 2, 4, 3, "#text3"),
newcol = c("#text1", "#text1", "#text1", "#text1", "#text2", "#text2", "#text2", "#text2", "#text3"),
stringsAsFactors = FALSE)
这是我尝试的操作,但它返回错误:
df_new = df %>% mutate(newcol = ifelse(grep("#", df$V1[]) == 1, df$V1[],lag(df$V1[])))
谢谢!
答案 0 :(得分:1)
如果其中存在V1
,我们可以在newcol
中复制"#"
或复制NA
,然后用tidyr::fill
填充那些缺失的值。
library(dplyr)
df %>%
mutate(newcol = ifelse(grepl("#", V1), V1, NA)) %>%
tidyr::fill(newcol)
# V1 newcol
#1 #text1 #text1
#2 1 #text1
#3 3 #text1
#4 4 #text1
#5 #text2 #text2
#6 2 #text2
#7 4 #text2
#8 3 #text2
#9 #text3 #text3