2017-03-23 138 views
2

我很習慣在數據的缺失情況下添加,但是這個用例轉義了我。R添加缺失的列和數據行(Dplyr/TidyR&Complete?)

我有許多dataframes(其略有不同),一個例子是:

> t1 
    3 4 5 
2 1 0 0 
3 0 2 2 
4 2 6 4 
5 1 2 1 

structure(list(`3` = c(1L, 0L, 2L, 1L), `4` = c(0L, 2L, 6L, 2L 
), `5` = c(0L, 2L, 4L, 1L)), .Names = c("3", "4", "5"), row.names = c("2", 
"3", "4", "5"), class = "data.frame") 

行名稱&列名應該是從1:5,顯然,其中這些失蹤單元值設置爲NA。對於上面的例子,這將給出:

> t1 
    1 2 3 4 5 
1 NA NA NA NA NA 
2 NA NA 1 0 0 
3 NA NA 0 2 2 
4 NA NA 2 6 4 
5 NA NA 1 2 1 

在每種情況下,任何一個或多個行的AND/OR列可能會丟失。

我可以很容易地使用Josh O'Brien here所描述的方法獲得缺失的列,但我缺少行方法。

任何人都可以幫忙嗎?

+1

在'基R',可以做'M1 < - 矩陣(NA,NcoI位= 5,nrow = 5,dimnames =列表(1:5,1: 5)); m1 [row.names(t1),colnames(t1)] < - unlist(t1)' – akrun

+1

哇。這是一種超高效的方法。我只是設法解決了如何在rownames上使用setdiff。但仍然有1行腳本與大約8!感謝Akrun(一如既往) – BarneyC

回答

1

我們可以創建所需的尺寸來港的matrixbase R這樣做是一個更簡單的方法,然後分配基於「T1」

m1 <- matrix(NA, ncol=5, nrow=5, dimnames = list(1:5, 1:5)) 
m1[row.names(t1), colnames(t1)] <- unlist(t1) 
m1 
# 1 2 3 4 5 
#1 NA NA NA NA NA 
#2 NA NA 1 0 0 
#3 NA NA 0 2 2 
#4 NA NA 2 6 4 
#5 NA NA 1 2 1 
的行名和列名「T1」的價值

或者使用tidyverse

library(tidyverse) 
rownames_to_column(t1, "rn") %>% 
     gather(Var, Val, -rn) %>% 
     mutate_at(vars(rn, Var), as.integer) %>% 
     complete(rn = seq_len(max(rn)), Var = seq_len(max(Var))) %>% 
     spread(Var, Val) 
# A tibble: 5 × 6 
#  rn `1` `2` `3` `4` `5` 
#* <int> <int> <int> <int> <int> <int> 
#1  1 NA NA NA NA NA 
#2  2 NA NA  1  0  0 
#3  3 NA NA  0  2  2 
#4  4 NA NA  2  6  4 
#5  5 NA NA  1  2  1 
0

根據您的喬希·奧布萊恩提到的解決方案,你可以做相同的,但使用rownames而不是names。看看下面的代碼..

df <- data.frame(a=1:4, e=4:1) 
colnms <- c("a", "b", "d", "e") 
rownms <- c("1", "2", "3", "4", "5") 
rownames(df) <- c("1", "3", "4", "5") 

## find missing columns and replace with zero, and order them 
Missing <- setdiff(colnms, names(df)) 
df[Missing] <- 0 
df <- df[colnms] 
df 

## do the same for rows 
MissingR <- setdiff(rownms, rownames(df)) 
df[MissingR,] <- 0 
df <- df[rownms,] 
df 

# > df 
# a b d e 
#1 1 0 0 4 
#2 0 0 0 0 
#3 2 0 0 3 
#4 3 0 0 2 
#5 4 0 0 1