2015-05-27 3 views
2

Я следующий кадр данныхПереформуйте кадр данных

structure(list(X1 = structure(c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 
3L, 3L, 3L, 3L), .Label = c("1", "2", "3"), class = "factor"), 
    V1 = c(1, NA, 1, 0, NA, NA, NA, NA, NA, NA, NA, NA), V2 = c(NA, 
    NA, NA, NA, 0, 0.25, 0.5, 1, NA, NA, NA, NA), V3 = c(NA, 
    NA, NA, NA, NA, NA, NA, NA, 0, 0.125, 0.75, 1)), .Names = c("X1", 
"V1", "V2", "V3"), row.names = c(NA, -12L), class = "data.frame") 

Я хочу ФР быть таким:

structure(list(X1 = c(1L, 1L, 1L, 1L), V1 = c(1L, NA, 1L, 0L), 
    V2 = c(0, 0.25, 0.5, 1), V3 = c(0, 0.125, 0.75, 1)), .Names = c("X1", 
"V1", "V2", "V3"), class = "data.frame", row.names = c("1", "2", 
"3", "4")) 

Моя идея выбора столбцов, deled НС-х и связать столбцы , Но есть наборы в наборе, и что-то говорит мне, что идея не будет работать/является длинным путем.

Q) Каков наилучший способ изменения df?

Спасибо!

+1

Почему вы теряете значения 'x1' за исключением' 1', почему 'NA' в' x2' сохраняется? Вы получите свой результат 'cbind (df [1: 4, 1: 2], sapply (df_ [, 3: 4], function (x) x [! Is.na (x)]))' например, как вы описали его ... Однако для меня ваше описание не однозначно. – lukeA

+0

@ lukeA Извините, не видел вашего ответа. Вы должны опубликовать его. – akrun

+0

На самом деле я не знаю, чего хочет OP, поэтому просто оставьте его там. :) – lukeA

ответ

0

Попробуйте

res <- data.frame(X1=1, sapply(df1[-1], function(x) { 
       indx <- which(!is.na(x)) 
       x[min(indx):max(indx)]})) 
res 
# X1 V1 V2 V3 
#1 1 1 0.00 0.000 
#2 1 NA 0.25 0.125 
#3 1 1 0.50 0.750 
#4 1 0 1.00 1.000 
+1

Спасибо @akrun – Adam

0

Может быть, вы можете просто рассмотреть pmax и split, что-то вроде этого:

as.data.frame(split(do.call(pmax, c(mydf[-1], na.rm = TRUE)), mydf$X1)) 
# X1 X2 X3 
# 1 1 0.00 0.000 
# 2 NA 0.25 0.125 
# 3 1 0.50 0.750 
# 4 0 1.00 1.000 

Если вам действительно нужен столбец из единиц, вы можете легко добавить, что в с cbind.

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