2017-02-20 43 views
0

Рассмотрим это:Добавить данные в data.frame с 0 строк

df <- data.frame(a=1:2, b=3:4) 

Я могу добавить новый столбец и присвоить значения это следующим образом:

df$c <- 5 

Но если я Подмножество это, так его пустой data.frame и попытаться присвоить что-либо к нему, он возвращает ошибку:

df2 <- subset(df, a==3) 
df2$d <- 10 

Error in $<-.data.frame(tmp, "d", value = 10) : replacement has 1 row, data has 0

Это остановит циклы, поэтому мой вопрос в том, есть ли другие способы назначения значений столбцу в фреймворке данных, который не возвращает ошибок, когда фрейм данных пуст?

+2

Вы можете создать функцию для проверки nrow набора данных перед выполнением задания то есть 'f1 <- function (dat, cname) {dat2 <- dat [dat [[cname]] == 3,]; if (nrow (df2)> 0) {dat2 $ d <- 10; dat2} else dat2} ' – akrun

+0

Это работает, но его немного писать (у меня длинный скрипт). Нет более разумного способа присвоить значения столбцу? –

+0

Если вы используете пакет 'dplyr', вы можете добавить столбец с' df2%>% mutate (d = 10) 'и он не будет разбиваться, если нет строки ... это помогает? Таким образом, это может быть 1-лайнер, например, 'df2 <- df %>% filter (a == 3)%>% mutate (d = 10)' – ztl

ответ

1

Вы можете достичь этого в одной строке с помощью dplyr, подмножая data.frame с помощью filter, а затем добавив новый столбец с mutate. Это не приведет к краху приводит ли ваша работа Подменит (filter здесь) в пустом data.frame или нет:

library(dplyr) 
df <- data.frame(a=1:2, b=3:4) 
df2 <- df %>% filter(a==3) %>% mutate(d=10) 
# [1] a b d 
# <0 rows> (or 0-length row.names) 
1

Если намерение ФП создать пустой data.frame с дополнительным столбцом вы, возможно, попробуйте:

df2$d <- integer(0) 
df2 
#[1] a b c d 
#<0 rows> (or 0-length row.names) 

Однако, это могло бы быть сделано в первоначальном вызове к data.frame, а также:

data.frame(a = integer(0), b = integer(0), c = integer(0), d = integer(0)) 
#[1] a b c d 
#<0 rows> (or 0-length row.names)