R:跨两列跟踪更改
我有一个记录公司名称变化的数据框。一个简单的表述是:R:跨两列跟踪更改,r,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 我怎么能在R里做呢?我不熟悉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
我怎么能在R里做呢?我不熟悉R和编程。如果能得到帮助就太好了
这个问题是重复的
然而,它并不是一个精确的复制品。原因如下:
1.这里使用的示例包含跨列更改的数据。重塑数据的问题并非如此。在这里,这两列是相互依赖的。
2.在重塑之前,我认为还有另一步:也许给正在发生的变化一个id。我不知道怎么做
你能帮我个忙吗?我们能假设一个相同的名字从来没有出现过吗(从来没有像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"
df Hi Sharvari,如果您留下一个带有可运行代码的可复制示例,这会很有帮助(因此我们不必通过创建自己的数据帧代码来重新创建您的示例)。请在此处阅读更多:。您的问题与akrun建议的问题不完全相同,但很接近,我认为您会发现整形()确实非常有用,因为您基本上有时间点数据。现在请尽快编辑问题。非常感谢。
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"