Прямой доступ к элементам Vector в data.frame в R? - PullRequest
2 голосов
/ 19 июня 2011

Возможно ли получить прямой доступ к элементам векторов в data.frame?

# DataFrame
nerv <- data.frame(
    c(letters[1:10]),
    c(1:10)
)

str(nerv)

# Accessing 5th element of the second variable/column
# This should give "5", but it does NOT work
nerv[2][5]

# Works, but I need to know the NAME of the column
nerv$c.1.10.[5]

Я попробовал несколько вещей, но ни одна из них не сработала. У меня есть только индекс столбца, но не имя, поскольку я хочу объединить несколько столбцов с помощью цикла.

Кажется, у меня есть пробел в базовых знаниях, и я надеюсь, что вы поможете мне восполнить его.

Ответы [ 3 ]

12 голосов
/ 19 июня 2011

Вы хотите:

> nerv[5,2]
[1] 5

Общий шаблон [r, c], где r индексирует строки, а c индексирует столбцы / переменные, которые вы хотите извлечь.Один или оба из них могут отсутствовать, и в этом случае это означает, что нужно указать все строки / столбцы, которые не имеют индексов.Например,

> nerv[, 2] ## all rows, variable 2
 [1]  1  2  3  4  5  6  7  8  9 10
> nerv[2, ] ## row 2, all variables
  c.letters.1.10.. c.1.10.
2                b       2

Обратите внимание, что для первого из них R отбросил пустое измерение, что привело к вектору.Чтобы подавить это поведение, добавьте drop = FALSE к вызову:

> nerv[, 2, drop = FALSE] ## all rows, variable 2
   c.1.10.
1        1
2        2
3        3
4        4
5        5
6        6
7        7
8        8
9        9
10      10

Мы также можем использовать нотацию в виде списка при извлечении компонентов фрейма данных.[ извлечет компонент (столбец) как фрейм данных из одного столбца, тогда как [[ извлечет то же самое, но отбросит измерения.Это поведение происходит от обычного поведения в списке, где [ возвращает список, тогда как [[ возвращает элемент внутри индексированного компонента.Некоторые примеры могут помочь:

> nerv[2]
   c.1.10.
1        1
2        2
3        3
4        4
5        5
6        6
7        7
8        8
9        9
10      10
> nerv[[2]]
 [1]  1  2  3  4  5  6  7  8  9 10
> nerv[[1:2]]
[1] 2

Это также объясняет, почему nerv[2][5] не удалось для вас.nerv[2] возвращает фрейм данных с одним столбцом, который вы затем пытаетесь извлечь из столбца 5.

Подробная информация об этом включена в файл справки ?Extract.data.frame или ?`[[.data.frame`

7 голосов
/ 20 июня 2011

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

nerv[[2]][5]
3 голосов
/ 19 июня 2011

try

nerv[5,2]

и ...

?'['

Это должно помочь немного заполнить ваш пробел.

...