#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"