如何使用sapply向数据框添加行?

时间:2015-09-29 00:07:50

标签: r sapply

我正在尝试在sapply函数调用中向数据框添加行,但是它返回一个矩阵,而我想要一个数据框,其中包含列中的变量和行中的名称/地址。

这是一个显示问题的简单示例。我这样做是为了避免使用'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"

1 个答案:

答案 0 :(得分:4)

sapply正在尝试将结果简化为矩阵,并且您没有获得预期的输出。

从&#34;简化&#34; apply中的参数:

  

逻辑或字符串;   应该将结果简化为向量,矩阵或更高   如果可能,维数组?

由于sapplylapply的简化输出的包装器,因此请尝试直接使用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