2013-08-06 4 views
1

Я могу назвать конкретные столбцы dataframe, как:Адрес несколько столбцов data.frame с одним именем

> x <- data.frame(t(1:3)); 
> names(x)[2] <- "X"; 
> x 
X1 X X3 
    1 2 3 
> x$X 
2 

Но когда я делаю следующее:

> names(x)[-1] <- "X"; 
> x 
X1 X X 
    1 2 3 

Оба столбца правильно названы с помощью «X», но я не могу адресовать все столбцы:

> x$X 
[1] 2 

Есть ли какие-либо средства адреса используя несколько столбцов data.frame, используя одно имя - и без жестко закодированное адресации, как в x[2:3]?

+0

Вам не нужна в Р. запятой – Thomas

+0

Yep, но я люблю их (:. – Rubens

+1

Там нет разумной причины иметь два data.frame столбцов с одинаковыми именами – Roland

ответ

2

Возможно хранить матрицу как переменную в кадре данных. Вы должны защитить матрицу, обернув ее внутри I(), или функция конструктора data.frame превратит ее в несколько переменных.

m <- matrix(1:20, nrow=5) 
df <- data.frame(x=letters[1:5], m=I(m)) 
df$m 
    [,1] [,2] [,3] [,4] 
[1,] 1 6 11 16 
[2,] 2 7 12 17 
[3,] 3 8 13 18 
[4,] 4 9 14 19 
[5,] 5 10 15 20 

Это, вероятно, не очень хорошая идея.

+1

+1 для _ «Это, вероятно, не очень хорошая идея» _ –

+0

+1 для * наилучшего подхода - несмотря на то, что это хорошая идея *. – Rubens

+0

@Rubens, чрезвычайно любопытно здесь относительно приложения. Вполне возможно, что мы ошибаемся, что эта задача очень подходит для приложения. –

3

Использование регулярных выражений:

x[,grep("^X$",names(x))] 
3

нет «прямой» способ захватить столбец с тем же именем. Если у вас есть два зеленых мелки в коробке, и вы говорите «дайте мне зеленый карандаш», как бы кто-нибудь знал , который crayon?

Вы можете запросить их у всех, но тогда вам нужно будет выполнить соответствующие действия. Один из вариантов использует grep, как предложил @thomas. Вы можете использовать %in%

x[, names(x) %in% "X"] 

Мне нравится использовать %in%, потому что это позволяет сделать использовать вектор выбора, такие как

x[, names(x) %in% c("X", "Y")] 

я, однако, хотел бы иметь уникальные имена столбцов;)

names(x) <- make.names(names(x)) 
+0

+1 Примечание: если /, поскольку длина (RHS) равна 1,'% in% 'может быть заменена на' == '. Не то, чтобы в этом было что-то плохое/неправильное. – Arun

+0

+1 Это гораздо точнее, чем маршрут регулярного выражения. – Thomas

+0

+1 Это именно та схема адресации, которую я искал. Фактически, весь вопрос заключается в том, как иметь под-'data.frame' в' data.frame'. Я думаю, это правильный подход. – Rubens

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