我已经就将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
的方法将不起作用(并非所有行都必须可用)。
答案 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: