R添加缺失的列和数据行(Dplyr/TidyR&Complete?)
问题描述:
我很习惯在数据的缺失情况下添加,但是这个用例转义了我。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所描述的方法获得缺失的列,但我缺少行方法。
任何人都可以帮忙吗?
答
我们可以创建所需的尺寸来港的matrix
与base 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
答
根据您的乔希·奥布莱恩提到的解决方案,你可以做相同的,但使用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
在'基R',可以做'M1 akrun
哇。这是一种超高效的方法。我只是设法解决了如何在rownames上使用setdiff。但仍然有1行脚本与大约8!感谢Akrun(一如既往) – BarneyC