我有一个数据框,记录公司名称的变化。一个简单的表示形式是:
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。我不知道该怎么做。
你能帮帮我吗?
答案 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"
结果是一个列表,而不是数据框,因为名称序列的数量可能不是唯一的(公司可能有不同数量的名称)。