在附加到`R` data.frame

时间:2018-09-19 14:21:16

标签: r

我已经就将row name作为新添加的行的一部分包含到数据帧中进行了一系列问答,但是在实现这一目标方面没有成功。

目的是从一个空的data.frame开始,并指定所需的列,并能够仅使用前三个列的值添加命名行(将最后一列留空/可选):

空的data.frame

> df
[1] trun       YErr       lambda.min lambda.1se
<0 rows> (or 0-length row.names)

让我们添加一个名称为{logr且仅设置了trun值的行:

      trun       YErr       lambda.min lambda.1se
logr   2983      93211.89      0.2189

动机是按名称访问该行:

    df["logr"]

我尝试了太多个选项来实现上述目的-距离解决方案 far 还很远。资源之一是这个问题:assign row name while rbind a row in a data frame。这是当前(非常差)的尝试:

cols = c("trun","Yhat", "lambda.min","lambda.1se")
ncols = length(cols)
df = as.data.frame(setNames(replicate(ncols,numeric(0), simplify = F), cols))

df = rbind(df, "logr" = c(2983, 93211.89,  0.2189)) 

这不会设置row.name-实际上,它也会覆盖列名。.

  X2983 X93211.89 X0.2189
1  2983  93211.89  0.2189

所以..然后需要进行一个完全独立的调用来设置row.name ??

row.names(df) = "logr"
> df
     X2983 X93211.89 X0.2189
logr  2983  93211.89  0.2189

行将在处理过程中的不同时间添加到data.frame ..因此,批量应用row.names 的方法将不起作用(并非所有行都必须可用)。

1 个答案:

答案 0 :(得分:1)

如果我理解正确,则需要在rbind调用中设置行名:

df = rbind(df, data.frame(trun = 2983,
                          Yhat = 93211.89,
                          lambda.min =  0.2189,
                          lambda.1se = NA,
                          row.names = "logr")) 

> df["logr", ]
     trun     Yhat lambda.min lambda.1se
logr 2983 93211.89     0.2189         NA

要添加新行(根据OP的后续操作):

df = rbind(df, data.frame(trun = 17,
                          Yhat = 18,
                          lambda.min =  19,
                          lambda.1se = NA,
                          row.names = "newline")) 

> df["newline", ]
        trun Yhat lambda.min lambda.1se
newline   17   18         19         NA

注意:如果要尽可能快地data.frame预先分配并填充data.frame,或者甚至动态地构建n <- 1000 df <- data.frame(trun = rep(NA, n), Yhat = rep(NA, n), lambda.min = rep(NA, n), lambda.1se = rep(NA, n)) rownames(df)[1] <- "logr" # note you can use a counter here to keep track of row instead of `1` df["logr", ] <- c(2983, 93211.89, 0.2189, NA) > df["logr", ] trun Yhat lambda.min lambda.1se logr 2983 93211.89 0.2189 NA > head(df) trun Yhat lambda.min lambda.1se logr 2983 93211.89 0.2189 NA 2 NA NA NA NA 3 NA NA NA NA 4 NA NA NA NA 5 NA NA NA NA 6 NA NA NA NA ,但是每10k这样做,这在R中效率极低。行之类的东西。

示例:

version: "2"

services: