Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/69.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R:跨两列跟踪更改_R - Fatal编程技术网

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"