如果我有以下对象
[1] 0 1 0 0 0 0 0 0 0
如何将其转换为此类,以便我可以将其放在一列中,并与数据框中的其他列对齐:
0
1
0
0
0
0
0
我认为list
可能有用......但是这个功能应该起作用
很抱歉要求假设是基本问题......
答案 0 :(得分:2)
如果你有data.frame
说," DF",就像这样:
DF <- data.frame(x=1:9, y=letters[1:9])
你是vector
z:
z <- c(0, 1, 0, 0, 0, 0, 0, 0, 0)
注意如果要将data.frame
添加到vector
,vector
的行数和data.frame
的长度必须相同dim(DF) # dimensions of data.frame
# [1] 9 2
length(z) # length of vector
# [1] 9
作为新列。
cbind
现在,您可以使用cbind(DF, z)
# x y z
# 1 1 a 0
# 2 2 b 1
# 3 3 c 0
# 4 4 d 0
# 5 5 e 0
# 6 6 f 0
# 7 7 g 0
# 8 8 h 0
# 9 9 i 0
获取新列,如下所示:
vector
如果您的data.frame
的长度不等于z <- c(0, 1, 0, 0, 0, 0, 0) # length is 7
cbind(DF, z)
# Error in data.frame(..., check.names = FALSE) :
# arguments imply differing number of rows: 9, 7
行的长度,那么,
cbind
list
由于长度不等导致错误。在这种情况下,我可以想到几种方法将其存储为data.frame
。
首先,您可以保留list
DF,并创建data.frame
,其第一个元素为vector
,第二个元素为my_l <- list(d1 = DF, d2 = z)
# $d1
# x y
# 1 1 a
# 2 2 b
# 3 3 c
# 4 4 d
# 5 5 e
# 6 6 f
# 7 7 g
# 8 8 h
# 9 9 i
#
# $d2
# [1] 0 1 0 0 0 0 0
,如下所示:< / p>
data.frame
或者,您可以将list
转换为data.frame
(list
内部为list
)并创建vectors
,其元素均为my_l <- c(as.list(DF), list(z=z))
# $x
# [1] 1 2 3 4 5 6 7 8 9
#
# $y
# [1] a b c d e f g h i
# Levels: a b c d e f g h i
#
# $z
# [1] 0 1 0 0 0 0 0
{1}}如下:
as.list
请注意,data.frame
会将list
列强制转换为data.frame
,并将list
的列名称命名为concatenate
。然后,我们使用c
运算符创建新的{{1}} z,然后{{1}}。
希望这会更好地理解你的理解。
答案 1 :(得分:2)
除了Aruns伟大而详细的答案外,还有两件事值得注意:
首先,R
回收较短的项目以匹配较长项目的长度。在向data.frame添加向量的情况下,只有在data.frame的行数是向量长度的精确倍数时才会出现这种情况。
zshort <- c(1, 2, 3)
# will be `0` if exact multiple:
length(zshort) %/% nrow(DF)
# [1] 0
cbind(DF, zshort)
# cbind(DF, zshort)
# x y zshort
# 1 a 1
# 2 b 2
# 3 c 3
# 4 d 1 <~~ Recycling
# 5 e 2
# 6 f 3
# 7 g 1 <~~ Recycling
# 8 h 2
# 9 i 3
(2)您还可以使用“[”向data.frame添加新列,如下所示:
# name of the column does NOT have to be
# the same as the name of the vector
DF[, "newName"] <- z
DF[, "shortz"] <- zshort
# You can also delete existing columns
DF[, "y"] <- NULL
DF
# x newName shortz
# 1 1 1
# 2 2 2
# 3 3 3
# 4 1 1
# 5 2 2
# 6 3 3
# 7 1 1
# 8 2 2
# 9 3 3