如何cbind或rbind不同长度的向量而不重复较短向量的元素?
我想要一个如下的输出如何cbind或rbind不同长度的向量而不重复较短向量的元素?,r,vector,R,Vector,我想要一个如下的输出 cbind(1:2, 1:10) [,1] [,2] [1,] 1 1 [2,] 2 2 [3,] 1 3 [4,] 2 4 [5,] 1 5 [6,] 2 6 [7,] 1 7 [8,] 2 8 [9,] 1 9 [10,] 2 10 诀窍是使所有输入的长度相
cbind(1:2, 1:10)
[,1] [,2]
[1,] 1 1
[2,] 2 2
[3,] 1 3
[4,] 2 4
[5,] 1 5
[6,] 2 6
[7,] 1 7
[8,] 2 8
[9,] 1 9
[10,] 2 10
诀窍是使所有输入的长度相同
[,1] [,2]
[1,] 1 1
[2,] 2 2
[3,] 3
[4,] 4
[5,] 5
[6,] 6
[7,] 7
[8,] 8
[9,] 9
[10,] 10
要去掉NA
s,输出必须是一个列表
cbind(x, y)
x y
[1,] 1 1
[2,] 2 2
[3,] NA 3
[4,] NA 4
[5,] NA 5
[6,] NA 6
[7,] NA 7
[8,] NA 8
[9,] NA 9
[10,] NA 10
Map(函数(…)
{
ans辅助功能
Map(function(...)
{
ans <- c(...)
ans[!is.na(ans)]
}, as.list(x), as.list(y)
)
[[1]]
[1] 1 1
[[2]]
[1] 2 2
[[3]]
[1] 3
[[4]]
[1] 4
[[5]]
[1] 5
[[6]]
[1] 6
[[7]]
[1] 7
[[8]]
[1] 8
[[9]]
[1] 9
[[10]]
[1] 10
bind.pad我遇到了类似的问题,我想建议一些人可能会觉得有用的附加解决方案。该解决方案非常简单,并利用了软件包和提供的功能
例子
旁白
按照原始示例,可以轻松删除列名:
> head(dta)
x y
[1,] 1 1
[2,] 2 2
[3,] NA 3
[4,] NA 4
[5,] NA 5
[6,] NA 6
我想提出一个替代解决方案,利用软件包及其功能
> head(dta)
[,1] [,2]
[1,] 1 1
[2,] 2 2
[3,] NA 3
[4,] NA 4
[5,] NA 5
[6,] NA 6
或者,为了匹配OP的期望输出:
> rowr::cbind.fill(1:2,1:10, fill = NA);
object object
1 1 1
2 2 2
3 NA 3
4 NA 4
5 NA 5
6 NA 6
7 NA 7
8 NA 8
9 NA 9
10 NA 10
鉴于上面的一些解决方案依赖于不再可用的包,这里提供了一个仅使用dplyr.
> rowr::cbind.fill(1:2,1:10, fill = '');
object object
1 1 1
2 2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
bind\u cols\u fill%add\u row(!!first:=rep(NA,max\u rows-nrow(df)))
})%%>%bind_cols()
}
请注意,这需要一个数据帧列表,因此如果只想组合两个向量,则会有点麻烦:
bind_cols_fill <- function(df_list) {
max_rows <- map_int(df_list, nrow) %>% max()
map(df_list, function(df) {
if(nrow(df) == max_rows) return(df)
first <- names(df)[1] %>% sym()
df %>% add_row(!!first := rep(NA, max_rows - nrow(df)))
}) %>% bind_cols()
}
x另一个没有依赖关系的解决方案:
x <- 1:2
y <- 1:10
bind_cols_fill(list(tibble(x), tibble(y))
my_绑定长度(x=y)){
len_diff Yup,这叫做循环利用,是R的基本概念之一。您还想要什么其他行为?这似乎也随着时间的推移得到了解决:,您也可以做R[这(!is.na(R))]
假设R
是矩阵的一行。长度(x)如果您只是想编写文件,那么在我执行cbind(x,y)时,出于某种原因,您可以通过执行x[is.NA(x)]将NA替换为空白我得到了重复…你如何添加NA?@Alex如果所有输入的长度都相同,那么就没有什么可重复的。你是否像我在回答中所说的那样更改了向量的长度?当处理两个以上的数据集时,此解决方案尤其优雅。使用do.call(qpcR::cbind.NA,…)
允许轻松地cbind
数据列表。任意长度的帧。cbind.na在包中不存在(不再存在?),QPCROWR已从CRAN中删除
> head(dta)
[,1] [,2]
[1,] 1 1
[2,] 2 2
[3,] NA 3
[4,] NA 4
[5,] NA 5
[6,] NA 6
> rowr::cbind.fill(1:2,1:10, fill = NA);
object object
1 1 1
2 2 2
3 NA 3
4 NA 4
5 NA 5
6 NA 6
7 NA 7
8 NA 8
9 NA 9
10 NA 10
> rowr::cbind.fill(1:2,1:10, fill = '');
object object
1 1 1
2 2 2
3 3
4 4
5 5
6 6
7 7
8 8
9 9
10 10
bind_cols_fill <- function(df_list) {
max_rows <- map_int(df_list, nrow) %>% max()
map(df_list, function(df) {
if(nrow(df) == max_rows) return(df)
first <- names(df)[1] %>% sym()
df %>% add_row(!!first := rep(NA, max_rows - nrow(df)))
}) %>% bind_cols()
}
x <- 1:2
y <- 1:10
bind_cols_fill(list(tibble(x), tibble(y))
my_bind <- function(x, y){
if(length(x = x) > length(x = y)){
len_diff <- length(x) - length(y)
y <- c(y, rep(NA, len_diff))
}else if(length(x = x) < length(x = y)){
len_diff <- length(y) - length(x)
x <- c(x, rep(NA, len_diff))
}
cbind(x, y)
}
my_bind(x = letters[1:4], y = letters[1:2])