R:根据不同列的顺序对列重新排序

时间:2019-05-18 13:55:04

标签: r

我有以下数据:

x  y   id
1  2      
2  2    1
3  4    
5  6    2
3  4  
2  1    3

列ID中的空白应与下一个ID值具有相同的值。意味着我的数据实际上应该像这样:

x  y   id
1  2    1  
2  2    1
3  4    2
5  6    2
3  4    3
2  1    3

我还有一个列表:

list[[1]] = 1 3 2

或一列:

c(1,3,2) = 1, 3, 2

现在,我想根据列列表中列的顺序对列ID重新排序我的数据。我的数据应该是这样的:

x  y   id
1  2   1   
2  2   1 
3  4   3
2  1   3
3  4   2
5  6   2

有有效的方法吗?

编辑:我不认为它是in R Sorting by absolute value without changing the data的副本,因为我不想按绝对值而是按列表中给出的特定顺序进行排序。

1 个答案:

答案 0 :(得分:3)

一个base R选项是(假设'id'列中的空白为NA

i1 <- !is.na(df1$id)
df1[i1,][match(df1$id[i1], list[[1]]),] <- df1[i1, ]
df1
#  x y id
#1 1 2 NA
#2 2 2  1
#3 3 4 NA
#4 2 1  3
#5 3 4 NA
#6 5 6  2

如果我们需要将NA更改为后续的非NA元素

library(zoo)
df1$id <- na.locf(df1$id, fromLast = TRUE)

数据

df1 <- structure(list(x = c(1L, 2L, 3L, 5L, 3L, 2L), y = c(2L, 2L, 4L, 
 6L, 4L, 1L), id = c(NA, 1L, NA, 2L, NA, 3L)), class = "data.frame", 
 row.names = c(NA, -6L))