让我们从下面的混乱(即df.sample
)获取此data.frame:
df
# > df
# a b
# 1 <NA> tre
# 2 tre pop
# 3 pop 123
# 4 123 ggg
第一行必须是列中的NA&#34; a&#34;。随后,此处的规则是b
列中的每个值都与下一行a
列中的值相同。
考虑带有乱码行的相同数据:
df.sample
# > df.sample
# a b
# 1 tre pop
# 2 123 ggg
# 3 pop 123
# 4 <NA> tre
如何连续订购对(即从df.sample
到df
),观察一对中b
列中的值与中的值相同的规则以下对中的a
列?
编辑:解决方案应该适用于种子的任何值(请参阅下面df.sample
的代码)。即无论看到的价值如何,我都希望从df
获得df.sample
。
数据:
df = data.frame(a = c(NA, "tre", "pop", "123"),
b = c("tre", "pop", "123", "ggg"),
stringsAsFactors = FALSE)
set.seed(1)
df.sample = dplyr::sample_n(df, 4)
rownames(df.sample) = NULL
答案 0 :(得分:1)
因此,我们知道第一行必须是“a”列中NA的那一行:
# create the new data frame to be filled in
newdf <- df.sample
newdf[] <- NA
(newdf[1, ] <- df.sample[is.na(df.sample$a), ])
# a b
#1 <NA> tre
从那里,你有一个具有适当行数的结构,你已经知道了第一行。因此,这需要通过适当的匹配来完成并分配每个后续行。一种方法是使用for循环:
for( i in seq_len(nrow(df.sample))[-1L] ) {
newdf[i, ] <- df.sample[match(newdf[i - 1L, "b"], df.sample[["a"]]), ]
}
newdf
# a b
#2 <NA> tre
#4 tre pop
#3 pop 123
#1 123 ggg
答案 1 :(得分:0)
你可以这样做:
df.sample %>%
mutate(c = lead(a, n=1)) %>%
select(a,c)
当然,您的示例建议将边缘情况保留为NA
,因此解决方案中也不会处理它们。
如果您始终通过df.sample
的抽样生成df
,则可以使用:
df.sample %>%
arrange(row.names(.)) %>%
mutate(c = lead(a, n=1)) %>%
select(a,c)
将根据您的要求订购输出。