2013-03-30 23 views
0

Если у меня есть следующий объектПреобразование строк/строк в одном столбце в R

[1] 0 1 0 0 0 0 0 0 0 

Как преобразовать его в этом, так что я могу положить его в одну колонку и она совпадала с моими другими столбцами в мой кадр данных:

0 
1 
0 
0 
0 
0 
0 

Я думал list может работать ... но какая функция должна эта работа по

Так жаль спрашивать, пусть будет основной вопрос ...

+1

Я предполагаю, что вы ищете 'cbind', но я могу более конкретно, без [воспроизводимого примера] (http://stackoverflow.com/questions/5963269/how-to-make-a-great-r-reproducible-example/5964905) того, что у вас есть. –

+0

Я думаю, что это может быть вектор, а не строка. Я бы посоветовал пройти один из многочисленных онлайн-уроков или подобрать книгу. – N8TRO

+0

Синий Магистр и Натан правы. Если вы хотите только транспонировать векторы, вы можете использовать функцию 't' – JT85

ответ

2

Если у вас есть data.frame сказать, "DF", как это:

DF <- data.frame(x=1:9, y=letters[1:9]) 

И у Вас есть vector г:

z <- c(0, 1, 0, 0, 0, 0, 0, 0, 0) 

Примечание, что число строк в вашем data.frame и длина vector должна быть одинаковой, если вы хотите добавить vector в data.frame в качестве новой колонки.

dim(DF) # dimensions of data.frame 
# [1] 9 2 

length(z) # length of vector 
# [1] 9 

Теперь вы можете использовать cbind, чтобы получить новую колонку:

cbind(DF, z) 
# x y z 
# 1 1 a 0 
# 2 2 b 1 
# 3 3 c 0 
# 4 4 d 0 
# 5 5 e 0 
# 6 6 f 0 
# 7 7 g 0 
# 8 8 h 0 
# 9 9 i 0 

Если у вас есть vector, длина которого не равен из data.frame строк, а затем,

z <- c(0, 1, 0, 0, 0, 0, 0) # length is 7 

cbind(DF, z) 
# Error in data.frame(..., check.names = FALSE) : 
# arguments imply differing number of rows: 9, 7 

cbind «ИНГ приводит к ошибке из-за разной длины s. В этом случае я мог бы подумать о двух способах сохранить это как list.

Во-первых, вы можете держать data.frame DF как таковой, и создать list с первым элементом, как data.frame, а второй как vector следующим образом:

my_l <- list(d1 = DF, d2 = z) 

# $d1 
# x y 
# 1 1 a 
# 2 2 b 
# 3 3 c 
# 4 4 d 
# 5 5 e 
# 6 6 f 
# 7 7 g 
# 8 8 h 
# 9 9 i 
# 
# $d2 
# [1] 0 1 0 0 0 0 0 

В качестве альтернативы, вы можете конвертировать ваши data.frame к listdata.frame внутренне в list) и создать list, элементами которого являются все vectors следующим образом:

my_l <- c(as.list(DF), list(z=z)) 

# $x 
# [1] 1 2 3 4 5 6 7 8 9 
# 
# $y 
# [1] a b c d e f g h i 
# Levels: a b c d e f g h i 
# 
# $z 
# [1] 0 1 0 0 0 0 0 

Обратите внимание, что as.list приводит в порядок data.frame столбцов к list с именами названий столбцов data.frame. Затем мы создаем новый list z, а затем concatenate с использованием оператора c.

Надеюсь, что это немного улучшит ваше понимание.

+0

+1 очень красивый и подробный –

2

В дополнение к Aruns большой и подробный ответ, есть две вещи, которые стоит отметить:

Во-первых, R перерабатывает более короткие элементы, чтобы соответствовать длине более длинных предметов.В случае добавления вектора в data.frame это будет происходить только в том случае, если количество строк в data.frame является точным кратным длине вектора.

zshort <- c(1, 2, 3) 

# will be `0` if exact multiple: 
length(zshort) %/% nrow(DF) 
# [1] 0 

cbind(DF, zshort) 
# cbind(DF, zshort) 
# x y zshort 
# 1 a  1 
# 2 b  2 
# 3 c  3 
# 4 d  1 <~~ Recycling 
# 5 e  2 
# 6 f  3 
# 7 g  1 <~~ Recycling 
# 8 h  2 
# 9 i  3 

(2) Вы можете также добавить новый столбец к data.frame, используя «[» следующим образом:

# name of the column does NOT have to be 
# the same as the name of the vector 
DF[, "newName"] <- z 

DF[, "shortz"] <- zshort 

# You can also delete existing columns 
DF[, "y"] <- NULL 

DF 
# x newName shortz 
# 1  1  1 
# 2  2  2 
# 3  3  3 
# 4  1  1 
# 5  2  2 
# 6  3  3 
# 7  1  1 
# 8  2  2 
# 9  3  3 
+0

(+1) для первой части об утилизации. Это важно, и я, кажется, пропустил это. – Arun

Смежные вопросы