Установка имен строк и оставление некоторых столбцов пустыми при добавлении в `R` data.frame - PullRequest
0 голосов
/ 19 сентября 2018

Я просмотрел ряд вопросов и ответов на тему включения 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"]

Я попробовал просто слишком много вариантов для достижения вышеуказанного - и я далеко от решения.Одним из ресурсов является этот вопрос: назначить имя строки, а rbind строки во фрейме данных .Вот (очень плохая) текущая попытка:

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 голосов
/ 19 сентября 2018

Если я правильно понимаю, вам нужно уже указать имя строки в вызове 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

Чтобы добавить новую строку (для каждого последующего наблюдения за операциями):

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

Примечание: Это очень неэффективно в R, если при любом возможном предварительном выделении data.frame и заполнении его намного быстрее, или даже динамическом построении data.frame, но это делается каждые 10k строк или что-то в этом роде.вот так.

Пример:

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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...