如何使用 sapply 向数据框添加行?
How do I add rows to a data frame using sapply?
我试图在 sapply 函数调用中向数据框添加行,但它返回一个矩阵,而我想要一个数据框,其中列中有变量,行中有 names/addresses。
这是一个演示问题的简单示例。我这样做是为了避免使用 'for' 循环。有人可以教我怎么做吗?
# initialize and empty data frame
absdf <- data.frame(
name = character(),
address = character(),
city = character(),
stringsAsFactors=FALSE)
# a numeric vector.
idvs <- c(123, 465)
print("initial empty data frame:")
print(absdf)
absdf <- sapply(idvs, function(idv) {
name <- paste("John Doe", idv)
address <- "123 Main St."
city <- "Elmhurst"
absdf <- rbind(absdf, data.frame(
name = name,
address = address,
city = city,
stringsAsFactors=FALSE))
})
# print it out - a sanity check
print("absdf final:")
print(absdf)
这是它的输出:
[1] "initial empty data frame:"
[1] name address city
<0 rows> (or 0-length row.names)
[1] "absdf final:"
[,1] [,2]
name "John Doe 123" "John Doe 465"
address "123 Main St." "123 Main St."
city "Elmhurst" "Elmhurst"
最后,为什么是矩阵?
> class(absdf)
[1] "matrix"
sapply
试图将结果简化为矩阵,但您没有得到预期的输出。
来自 apply
中的 "simplify" 参数:
logical or character string;
should the result be simplified to a vector, matrix or higher
dimensional array if possible?
由于 sapply
是 lapply
的包装器以简化输出,请尝试直接使用 lapply
创建数据帧。
流行的函数调用do.call(rbind, <list>)
结合了列表的元素。
absdf <- lapply(idvs, function(idv) {
name <- paste("John Doe", idv)
address <- "123 Main St."
city <- "Elmhurst"
data.frame(
name = name,
address = address,
city = city,
stringsAsFactors=FALSE)
})
do.call(rbind, absdf)
# name address city
# 1 John Doe 123 123 Main St. Elmhurst
# 2 John Doe 465 123 Main St. Elmhurst
我试图在 sapply 函数调用中向数据框添加行,但它返回一个矩阵,而我想要一个数据框,其中列中有变量,行中有 names/addresses。
这是一个演示问题的简单示例。我这样做是为了避免使用 'for' 循环。有人可以教我怎么做吗?
# initialize and empty data frame
absdf <- data.frame(
name = character(),
address = character(),
city = character(),
stringsAsFactors=FALSE)
# a numeric vector.
idvs <- c(123, 465)
print("initial empty data frame:")
print(absdf)
absdf <- sapply(idvs, function(idv) {
name <- paste("John Doe", idv)
address <- "123 Main St."
city <- "Elmhurst"
absdf <- rbind(absdf, data.frame(
name = name,
address = address,
city = city,
stringsAsFactors=FALSE))
})
# print it out - a sanity check
print("absdf final:")
print(absdf)
这是它的输出:
[1] "initial empty data frame:"
[1] name address city
<0 rows> (or 0-length row.names)
[1] "absdf final:"
[,1] [,2]
name "John Doe 123" "John Doe 465"
address "123 Main St." "123 Main St."
city "Elmhurst" "Elmhurst"
最后,为什么是矩阵?
> class(absdf)
[1] "matrix"
sapply
试图将结果简化为矩阵,但您没有得到预期的输出。
来自 apply
中的 "simplify" 参数:
logical or character string; should the result be simplified to a vector, matrix or higher dimensional array if possible?
由于 sapply
是 lapply
的包装器以简化输出,请尝试直接使用 lapply
创建数据帧。
流行的函数调用do.call(rbind, <list>)
结合了列表的元素。
absdf <- lapply(idvs, function(idv) {
name <- paste("John Doe", idv)
address <- "123 Main St."
city <- "Elmhurst"
data.frame(
name = name,
address = address,
city = city,
stringsAsFactors=FALSE)
})
do.call(rbind, absdf)
# name address city
# 1 John Doe 123 123 Main St. Elmhurst
# 2 John Doe 465 123 Main St. Elmhurst