Как извлечь значения из существующей переменной и вставить их в верхние строки кадра данных (используя R) - PullRequest
0 голосов
/ 05 октября 2018

Вероятно, есть очень простое решение для этого, но я не могу понять это по какой-то причине.Вот как выглядят мои данные (в R) (за исключением value_new, который является точным описанием того, что мне нужно!):

dat<-data.frame("id"=c(1,2,3,4,5,NA,NA,NA,NA,NA),
      "value"=c(rep(NA,5),7,NA,4,1,9),
      "value_new"=c(7,NA,4,1,9,rep(NA,5)))

Я надеюсь, что это говорит само за себя.Что мне нужно, так это значения «value» для is.na(value) (т.е. первые пять строк) и вставить эти значения как первые пять строк (т.е. когда value<0) новой переменной, которую я бынравится называть "value_new".

Какой простой способ сделать это?Мне нужно вырезать нижнюю половину и вставить ее как новую переменную (и) в верхнюю часть кадра данных.Надеюсь, что это имеет смысл.

Ответы [ 2 ]

0 голосов
/ 05 октября 2018
dat<-data.frame("id"=c(1,2,3,4,5,NA,NA,NA,NA,NA),
                "value"=c(rep(NA,5),7,NA,4,1,9),
                "value_new"=c(7,NA,4,1,9,rep(NA,5)))

ind    <- which(!is.na(dat$value))[1]
newcol <- `length<-`(dat$value[ind:nrow(dat)], nrow(dat))

dat$value_new2 <- newcol

#   id value value_new value_new2
#1   1    NA         7          7
#2   2    NA        NA         NA
#3   3    NA         4          4
#4   4    NA         1          1
#5   5    NA         9          9
#6  NA     7        NA         NA
#7  NA    NA        NA         NA
#8  NA     4        NA         NA
#9  NA     1        NA         NA
#10 NA     9        NA         NA

Короткая версия:

dat$value_new2 <- `length<-`(dat$value[which(!is.na(dat$value))[1]:nrow(dat)], nrow(dat))

Я удаляю первый продолжающийся NA и добавляю их в конец.Не считая ID здесь.

0 голосов
/ 05 октября 2018
dat<-data.frame("id"=c(1,2,3,4,5,NA,NA,NA,NA,NA),
                "value"=c(rep(NA,5),7,NA,4,1,9))

dat$value_new = NA
dat$value_new[!is.na(dat$id)] = dat$value[is.na(dat$id)]
dat

#    id value value_new
# 1   1    NA         7
# 2   2    NA        NA
# 3   3    NA         4
# 4   4    NA         1
# 5   5    NA         9
# 6  NA     7        NA
# 7  NA    NA        NA
# 8  NA     4        NA
# 9  NA     1        NA
# 10 NA     9        NA

В случае, если у вас больше строк с не- NA id по сравнению с NA id, вы можете использовать:

dat<-data.frame("id"=c(1,2,3,4,5,6,NA,NA,NA,NA,NA),
                "value"=c(rep(NA,6),7,NA,4,1,9))

k = sum(is.na(dat$id))
dat$value_new = NA
dat$value_new[!is.na(dat$id)][1:k] = dat$value[is.na(dat$id)]
dat

#    id value value_new
# 1   1    NA         7
# 2   2    NA        NA
# 3   3    NA         4
# 4   4    NA         1
# 5   5    NA         9
# 6   6    NA        NA
# 7  NA     7        NA
# 8  NA    NA        NA
# 9  NA     4        NA
# 10 NA     1        NA
# 11 NA     9        NA

, где k - это числозначений, которые вы замените в верхней части нового столбца.

...