按共享值排序

时间:2017-02-01 06:22:18

标签: r

让我们从下面的混乱(即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.sampledf),观察一对中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

2 个答案:

答案 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)

将根据您的要求订购输出。