如何在 R 中创建向量列

How to create a vector column in R

提问人:lo edwin 提问时间:11/15/2023 最后编辑:ThomasIsCodinglo edwin 更新时间:11/15/2023 访问量:81

问:

例如,我有一个数据框:

data <- data.frame(a=c(1,0,1),b=c(0,0,1),c=c(1,1,1),d=c(0,1,0))

enter image description here

如何添加像这样向量列(不是列表):

enter image description here

这个“组合”列将把整行的数据存储到一个向量中。

R 数据帧

评论

0赞 LMc 11/15/2023
我认为如果你想将数据保持为数字,你将不得不考虑一个列表列。你试图避免这种情况有什么原因吗?
5赞 GuedesBF 11/15/2023
我们已经有了几个好的和有创意的答案,但我强烈怀疑这是一个xyproblem。在下游分析中,我们不太可能从任何不包含以下变量类之一的 data.frame 列的存储方法中受益:向量、tibbles(嵌套的 tibbles)或列表列。我们能给出的最佳答案可能只是另一个问题:为什么需要这种“嵌套向量”解决方案?

答:

1赞 Andrey Shabalin 11/15/2023 #1

以下是手动添加此类列的命令:

data = data.frame(a=c(1,0,1), b=c(0,0,1), c=c(1,1,1), d=c(0,1,0))

data$v = list(c(1,0,1,0), c(0,0,1,1), c(1,1,1,0))

data

#   a b c d          v
# 1 1 0 1 0 1, 0, 1, 0
# 2 0 0 1 1 0, 0, 1, 1
# 3 1 1 1 0 1, 1, 1, 0

或者在创建数据框时:

data = data.frame(
  a = c(1, 0, 1),
  b = c(0, 0, 1),
  c = c(1, 1, 1),
  d = c(0, 1, 0),
  v = list(c(1,0,1,0), c(0,0,1,1), c(1,1,1,0))

更新:我已经更仔细地阅读了你的问题。以下是从数据框的其余部分填充的方法:data$v

data = data.frame(a=c(1,0,1),b=c(0,0,1),c=c(1,1,1),d=c(0,1,0))
vtmp = vector('list', nrow(data))
for( i in 1:nrow(data) )
  vtmp[[i]] = as.vector(sapply(data, `[`, i));

data$v = vtmp;

data

#   a b c d          v
# 1 1 0 1 0 1, 0, 1, 0
# 2 0 0 1 1 0, 0, 1, 1
# 3 1 1 1 0 1, 1, 1, 0
1赞 M.Viking 11/15/2023 #2

编辑,用于创建数据帧列表:split()

data$combined <- split(data, 1:NROW(data))

你说“不是列表”,我们可以使用粘贴来做一个字符串:

library(dplyr)
data <- mutate(data, combined = paste(a,b,c,d))

#   a b c d combined
# 1 1 0 1 0  1 0 1 0
# 2 0 0 1 1  0 0 1 1
# 3 1 1 1 0  1 1 1 0
1赞 Friede 11/15/2023 #3

中的一个选项:base

data <- data.frame(a=c(1,0,1),b=c(0,0,1),c=c(1,1,1),d=c(0,1,0))
data$combined <- as.array(
  sapply(X = seq(nrow(data)), 
         FUN = \(i) unname(unlist(data[i, ])), 
         simplify = FALSE))

> class(data$combined) # not a list 
[1] "array"
> data
  a b c d   combined
1 1 0 1 0 1, 0, 1, 0
2 0 0 1 1 0, 0, 1, 1
3 1 1 1 0 1, 1, 1, 0

评论

1赞 Andrey Shabalin 11/15/2023
干得好。我没有把它变成一句话
1赞 LMc 11/15/2023 #4
data$combined <- apply(data, 1, toString)

注意:是字符。data$combined

1赞 ThomasIsCoding 11/15/2023 #5

您可以简单地使用as.matrix + asplit

data$combined <- asplit(as.matrix(data), 1)

您将获得

> data
  a b c d   combined
1 1 0 1 0 1, 0, 1, 0
2 0 0 1 1 0, 0, 1, 1
3 1 1 1 0 1, 1, 1, 0

评论

0赞 Friede 11/15/2023
我最近注意到:如果矩阵技巧是一种选择,看看托马斯的答案(+1)。