How to add rows to empty data frames with header in R? [duplicate]
Possible Duplicate:
R: losing column names when adding rows to an empty data frame
I created an empty dataframe with column names only as follows
> compData <- data.frame(A= numeric(0), B= numeric(0))
> compData
[1] A B
<0 rows> (or 0-length row.names)
> compData <- rbind(compData,c(5,443))
> compData
X5 X443
1 5 443
in the above after adding one row the column names are changed. How can I add new row data to data-frame?
Solution 1:
Adding to a zero-row data.frame
will act differently to adding to an data.frame
that already contains rows
From ?rbind
The rbind data frame method first drops all zero-column and zero-row arguments. (If that leaves none, it returns the first argument with columns otherwise a zero-column zero-row data frame.) It then takes the classes of the columns from the first data frame, and matches columns by name (rather than by position). Factors have their levels expanded as necessary (in the order of the levels of the levelsets of the factors encountered) and the result is an ordered factor if and only if all the components were ordered factors. (The last point differs from S-PLUS.) Old-style categories (integer vectors with levels) are promoted to factors.
You have a number of options --
the most straightforward
compData[1, ] <- c(5, 443)
more complicated
Or you could coerce c(5,433)
to a list or data.frame
rbind(compData,setNames(as.list(c(5,443)), names(compData)))
or
rbind(compData,do.call(data.frame,setNames(as.list(c(5,443)), names(compData))))
But in this case you might as well do
do.call(data.frame,setNames(as.list(c(5,443)), names(compData)))
data.table option
You could use the data.table
function rbindlist
which does less checking and thus preserves the names of the first data.frame
library(data.table)
rbindlist(list(compData, as.list(c(5,443))
Solution 2:
I just got a simpler way to do it... as follows
compData <- data.frame(A= numeric(0), B= numeric(0))
compData
compData[nrow(compData)+1, ] <- c(5, 443)
compData
Solution 3:
Colnames <- names(compData)
compData <- rbind(compData, c(5, 443))
names(compData) <- Colnames
Solution 4:
You can assign to the dataframe by index:
compData <- data.frame(A= numeric(0), B= numeric(0))
compData
compData[1, ] <- c(5, 443)
compData
Which gives:
> compData <- data.frame(A= numeric(0), B= numeric(0))
> compData
[1] A B
<0 rows> (or 0-length row.names)
> compData[1, ] <- c(5, 443)
> compData
A B
1 5 443
Solution 5:
You can use the function structure
with the .Names
argument:
compData <- structure(rbind(compData,c(5,443)), .Names = names(compData))
# A B
#1 5 443