R:跟踪两列

时间:2017-06-02 15:14:09

标签: r

我有一个数据框,记录公司名称的变化。一个简单的表示形式是:

df <- data.frame(key  = c("A", "B","C", "E","F","G"), Change = c("B", "C","D" ,"F","G","H"))
print(df)

   Key Change
1   A      B
2   B      C
3   C      D
4   E      F
5   F      G
6   G      H

我想跟踪值正在经历的所有更改。这是一个可以帮助我这样做的输出:

Key 1st 2nd  3rd  4th
1   A    B    C    D
2   E    F    G    H

我怎样才能在R中做到?我是R和编程新手。获得帮助会很棒。

该问题被标记为How to reshape data from long to wide format?

重复

然而,它并非完全相同。原因如下: 1.此处使用的示例包含跨列更改的数据。重塑数据的问题并非如此。这里,两列相互依赖。 2.在重塑之前,我认为还有另一个步骤:可能会给出正在发生的变化的ID。我不知道该怎么做。

你能帮帮我吗?

1 个答案:

答案 0 :(得分:0)

我们可以假设同名永远不会出现(绝不会像A-> B-> C和D-> E-> A)?如果是这样,您可以执行以下操作。

df <- data.frame(key    = c("A","B","C", "E","F","G"),
                 Change = c("B","C","D" ,"F","G","H"))
print(df)

# mapping from old to new name
next_name <- as.character(df$Change)
names(next_name) <- df$key

all_names <- unique(c(as.character(df$key), as.character(df$Change)))
get_id <- function(x) {
  # for each name, repeatedly traverse until the final name
  ss <- x %in% names(next_name)
  if (any(ss)) {
    x[ss] <- get_id(next_name[x[ss]])
  }
  x
}
ids <- get_id(all_names)
lapply(unique(ids), function(i) c(all_names[ids==i]))

# out come is a list of company names, 
# each entry represents a history of a firm
##[[1]]
##[1] "A" "B" "C" "D"
##[[2]]
##[1] "E" "F" "G" "H"

结果是一个列表,而不是数据框,因为名称序列的数量可能不是唯一的(公司可能有不同数量的名称)。