如何在 R 中绑定不同长度的向量?
How to cbind vectors of different length in R?
我需要将 R 中的一些命名数值向量组合成一个数据框。我在另一个问题中尝试 cbind.na
作为建议,但它不会考虑名字。示例:
v1 <- c(1,5,6,7)
names(v1) <- c("milk", "flour", "eggs", "sugar")
v2 <- c(2,3)
names(v2) <- c("fish", "chips")
v3 <- c(5,7,4)
names(v3) <- c("chips", "milk", "sugar")
数据框应如下所示
v1 v2 v3
milk 1 NA 7
flour 5 NA NA
eggs 6 NA NA
sugar 7 NA 4
fish NA 2 NA
chips NA 3 5
我不知道如何在 R 中解决这个问题。
这是一个连接,最好使用 data.table
或其他加载项完成,但是(尤其是对于较小的数组)可以通过创建所有名称的数组在基础 R
中轻松执行并用它来索引输入数组:
s <- unique(names(c(v1,v2,v3)))
x <- cbind(v1=v1[s], v2=v2[s], v3=v3[s])
rownames(x) <- s
print(x)
v1 v2 v3
milk 1 NA 7
flour 5 NA NA
eggs 6 NA NA
sugar 7 NA 4
fish NA 2 NA
chips NA 3 5
# get vectors into one list
v <- mget(paste0('v', 1:3))
# convert vectors to data frames
l <- lapply(v, stack)
# merge them all sequentially
out <- Reduce(function(x, y) merge(x, y, by = 'ind', all = T), l)
# name the columns according to the original vector names
setNames(out, c('ind', names(v)))
# ind v1 v2 v3
# 1 milk 1 NA 7
# 2 flour 5 NA NA
# 3 eggs 6 NA NA
# 4 sugar 7 NA 4
# 5 fish NA 2 NA
# 6 chips NA 3 5
编辑:
我认为这比 whuber 的解决方案更糟糕,因为它需要在 lapply 步骤和 Reduce 步骤中创建一堆中间表。虽然还没有做任何基准测试。
我需要将 R 中的一些命名数值向量组合成一个数据框。我在另一个问题中尝试 cbind.na
作为建议,但它不会考虑名字。示例:
v1 <- c(1,5,6,7)
names(v1) <- c("milk", "flour", "eggs", "sugar")
v2 <- c(2,3)
names(v2) <- c("fish", "chips")
v3 <- c(5,7,4)
names(v3) <- c("chips", "milk", "sugar")
数据框应如下所示
v1 v2 v3
milk 1 NA 7
flour 5 NA NA
eggs 6 NA NA
sugar 7 NA 4
fish NA 2 NA
chips NA 3 5
我不知道如何在 R 中解决这个问题。
这是一个连接,最好使用 data.table
或其他加载项完成,但是(尤其是对于较小的数组)可以通过创建所有名称的数组在基础 R
中轻松执行并用它来索引输入数组:
s <- unique(names(c(v1,v2,v3)))
x <- cbind(v1=v1[s], v2=v2[s], v3=v3[s])
rownames(x) <- s
print(x)
v1 v2 v3 milk 1 NA 7 flour 5 NA NA eggs 6 NA NA sugar 7 NA 4 fish NA 2 NA chips NA 3 5
# get vectors into one list
v <- mget(paste0('v', 1:3))
# convert vectors to data frames
l <- lapply(v, stack)
# merge them all sequentially
out <- Reduce(function(x, y) merge(x, y, by = 'ind', all = T), l)
# name the columns according to the original vector names
setNames(out, c('ind', names(v)))
# ind v1 v2 v3
# 1 milk 1 NA 7
# 2 flour 5 NA NA
# 3 eggs 6 NA NA
# 4 sugar 7 NA 4
# 5 fish NA 2 NA
# 6 chips NA 3 5
编辑: 我认为这比 whuber 的解决方案更糟糕,因为它需要在 lapply 步骤和 Reduce 步骤中创建一堆中间表。虽然还没有做任何基准测试。