R: управление автоматически созданными именами столбцов в вызове rbind () - PullRequest
3 голосов
/ 24 февраля 2012

Если я сделаю что-то вроде этого:

> df <- data.frame()
> rbind(df, c("A","B","C"))
  X.A. X.B. X.C.
1    A    B    C

Вы видите, как строка добавляется в пустой фрейм данных. Однако столбцы получают имена автоматически в зависимости от содержимого данных.

Это вызывает проблемы, если позже я захочу:

> df <- rbind(df, c("P", "D", "Q"))

Есть ли способ управления именами столбцов, которые автоматически создаются rbind? Или каким-то другим способом сделать то, что я пытаюсь сделать здесь?

Ответы [ 2 ]

7 голосов
/ 24 февраля 2012

@ baha-kev имеет хороший ответ относительно строк и факторов.

Я просто хочу указать на странное поведение rbind для data.frame:

# This is "should work", but it doesn't:
# Create an empty data.frame with the correct names and types
df <- data.frame(A=numeric(), B=character(), C=character(), stringsAsFactors=FALSE)
rbind(df, list(42, 'foo', 'bar')) # Messes up names!
rbind(df, list(A=42, B='foo', C='bar')) # OK...

# If you have at least one row, names are kept...
df <- data.frame(A=0, B="", C="", stringsAsFactors=FALSE)
rbind(df, list(42, 'foo', 'bar')) # Names work now...

Ноесли у вас есть только строки, то почему бы не использовать матрицу вместо этого?Тогда все работает нормально, чтобы начать с пустой матрицы:

# Create a 0x3 matrix:
m <- matrix('', 0, 3, dimnames=list(NULL, LETTERS[1:3]))

# Now add a row:
m <- rbind(m, c('foo','bar','baz')) # This works fine!
m

# Then optionally turn it into a data.frame at the end...
as.data.frame(m, stringsAsFactors=FALSE)
2 голосов
/ 24 февраля 2012

Установите для параметра "stringsAsFactors" значение False, которое хранит значения в виде символов:

df=data.frame(first = 'A', second = 'B', third = 'C', stringsAsFactors=FALSE)
rbind(df,c('Horse','Dog','Cat'))
  first second third
1     A      B     C
2 Horse    Dog   Cat

sapply(df2,class)
      first      second       third 
"character" "character" "character" 

Позже, если вы хотите использовать факторы, вы можете преобразовать его следующим образом:

df2 = as.data.frame(df, stringsAsFactors=T)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...