R将data.frame结构从成对列更改为成对行

时间:2017-08-22 21:00:52

标签: r dataframe

改变这个:

From        To
A           D
B           E
C           F

为:

From        To
A           B
B           C
D           E
E           F

我的数据包含数百行,而不是示例中的3行。

注意:澄清初始data.frame中的名称是两个单独的路径,我想将其格式化为边缘列表。我不想连接这两条路径。

在这种情况下,我们想要消除C和D之间的边缘。

3 个答案:

答案 0 :(得分:2)

使用zoo试试这个?

A=c(Data$From,Data$To)
B=as.data.frame(zoo::rollapply(A,2,paste))


  V1 V2
1  A  B
2  B  C
3  C  D
4  D  E
5  E  F
B[!B$V1%in%Data$From[length(Data$From)],]

  V1 V2
1  A  B
2  B  C
4  D  E
5  E  F

PS。使用names(df)=c('Form','To')

更改名称

答案 1 :(得分:2)

全部在 Base R

#[-nrow(dat), ] This removes the link between to columns (i.e. From C To D row)
data.frame(From = unlist(dat)[-length(unlist(dat))], To = unlist(dat)[-1], 
    row.names = NULL)[-nrow(dat), ] 

##   From To
## 1    A  B
## 2    B  C
## 4    D  E
## 5    E  F

<强> 数据:

 dat <- structure(list(From = structure(1:3, .Label = c("A", "B", "C"      
     ), class = "factor"), To = structure(1:3, .Label = c("D", "E",        
     "F"), class = "factor")), .Names = c("From", "To"), row.names = c(NA, 
     3L), class = "data.frame")  

答案 2 :(得分:1)

数据

df <- data.frame(From=LETTERS[1:3], To=LETTERS[4:6], stringsAsFactors=F)

解决方案拆分路径

library(dplyr)
df1 <- data.frame(From = head(unlist(df),-1), To = head(lead(unlist(df)),-1)) %>%
           filter(row_number() != nrow(df))

解释

unlist按行列出您的dflead将条目移到某个位置。

输出

  From To
1    A  B
2    B  C
3    D  E
4    E  F