2017-02-20 51 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 < - 函數(dat,cname){dat2 < - dat [dat [[cname]] == 3,];如果(nrow(df2)> 0){dat2 $ d < - 10; dat2} else dat2}' – akrun

+0

這有效,但它有點寫(我有一個長腳本)。沒有「聰明」的方式爲列賦值? –

+0

如果你使用包'dplyr',你可以添加一個包含'df2%>%mutate(d = 10)'的列,如果沒有行,它不會崩潰......它有幫助嗎?因此,它可能是一個類似於'df2 <- df %>%filter(a == 3)%>%mutate(d = 10)'的單線程代碼' – ztl

回答

1

您可以通過dplyr通過將數據框子集與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

如果OP的目的是,你可能一個附加列創建一個空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)