Выбор значений из фрейма данных с 3 столбцами в R

#r

#r

Вопрос:

У меня есть трехмерный массив, переменными которого являются x, y и z. x — это список мест, y — это список времени, а z — это список имен. Список имен не запускается в одно и то же начальное время во всех местах:

 x   y   z
x1  1   NA
x1  2   z2
x1  3   z3
x1  4   z1
x2  1   NA
x2  2   NA
x2  3   z5
x2  4   z3
x3  1   z3
x3  2   z1
x3  3   z2
x3  4   z2
  

Как мне найти первый z для каждого x? Я хочу, чтобы выходная матрица или фрейм данных были:

 x  z
x1 z2
x2 z5
x3 z3
  

Комментарии:

1. пожалуйста, предоставьте несколько примеров данных, поскольку я понятия не имею, как именно выглядит ваш массив. Насколько это выглядит сейчас, у вас есть простая матрица, а не 3D-массив в качестве структуры данных.

2. Есть ли какой-либо способ загрузить образец данных?

3. Создайте небольшой воспроизводимый пример, используя matrix() или попробуйте dput(your.data) .

4. Хорошо, я только что отредактировал исходное сообщение, включая образцы данных.

5. теперь это выглядит как фрейм данных (который является двумерным, смотрите Введение в R для получения некоторых примеров массивов).

Ответ №1:

ОТРЕДАКТИРОВАНО после предоставления данных примера

Вы можете использовать функцию ddply() в пакете plyr

 dat <- "x   y   z
x1  1   NA
x1  2   z2
x1  3   z3
x1  4   z1
x2  1   NA
x2  2   NA
x2  3   z5
x2  4   z3
x3  1   z3
x3  2   z1
x3  3   z2
x3  4   z2"

df <- read.table(textConnection(dat), header=TRUE, stringsAsFactors=FALSE)

library(plyr)
ddply(df, .(x), function(x)x[!is.na(x$z), ][1, "z"])

   x V1
1 x1 z2
2 x2 z5
3 x3 z3
  

Ответ №2:

Если вы не хотите использовать plyr

 t(data.frame(lapply(split(df, as.factor(df$x)), function(k) head(k$z[!is.na(k$z)], 1))))

   [,1]
x1 "z2"
x2 "z5"
x3 "z3"