2015-10-19 3 views
1

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

Первый столбец набора данных - это имя учащегося, остальная часть набора данных представляет разделы завершенной программы. Последний столбец каждой строки, содержащий данные, представляет собой заключительный раздел, завершенный учеником.

Таким образом, выход должен быть вектором следующее:

name, sections that are blank and contain NA (i.e. 1_1 or 1_3 etc.) 
name, sections that are blank and contain NA 
name, sections that are blank and contain NA etc. 

Вот кадр данных:

df<-data.frame(list(names = c("John", "Peter", "Steve"), 
        '1_1' = c("yes", "yes","yes"), 
        '1_2' = c("yes", "yes", ""), 
        '1_3' = c("", "yes", "yes"), 
        '1_4' = c("", "","yes"), 
        '1_5' = c(NA, NA, NA)), 
       row.names = NULL) 
df 
# names X1_1 X1_2 X1_3 X1_4 X1_5 
# 1 John yes yes    NA 
# 2 Peter yes yes yes  NA 
# 3 Steve yes  yes yes NA 

df<-apply(df, 2, function(x) gsub("^|^", NA, x)) 
# names X1_1 X1_2 X1_3 X1_4 X1_5 
# [1,] NA NA NA NA NA NA 
# [2,] NA NA NA NA NA NA 
# [3,] NA NA NA NA NA NA 

я получаю следующее после GSUB, который предназначен для Наливаем в НС balnk пространства:

names X1_1 X1_2 X1_3 X1_4 X1_5 
[1,] "John" "yes" "yes" NA NA NA 
[2,] "Peter" "yes" "yes" "yes" NA NA 
[3,] "Steve" "yes" NA "yes" "yes" NA 

Вот код, который я пытаюсь к нам:

sapply(df,function(x) 
which(x== if(df>2) 
{ 
list(df[,]) 
} 
)) 

Выход я хочу (как указано выше) вектора со следующим:

name, all fields that contain NA (i.e. 1_1, 1_2 etc.) 
name, all fields that contain NA (i.e. 1_1, 1_2 etc.) 
etc. 

Выход R я получаю это:

$John integer(0) 

$Peter integer(0) 

$Steve integer(0) 

$yes integer(0) 

$yes integer(0) 

$yes integer(0) 

$yes integer(0) 

$yes integer(0) 

$ integer(0) 

$ integer(0) 

$yes integer(0) 

$yes integer(0) 

$ integer(0) 

$ integer(0) 

$yes integer(0) 

$ integer(0) 

$ integer(0) 

$ integer(0) 

Таким образом, не работает вообще. Любые указатели?

Еще раз спасибо.

Леви

+0

ваши данные не работает для меня, пожалуйста, проверьте мои изменения, чтобы увидеть, если это то, что он выглядит, если вы не можете изменить его на правильный код. Я не уверен, что должен делать 'gsub', вы можете уточнить свой вопрос. – rawr

+0

' gsub' просто добавляет 'NA' во все пробелы. Я сделал это, потому что у моего исходного набора данных нет 'NA' во всех пустых местах. Я использовал ваш код, а затем «gsub», и я возвращаю следующее: «имена X1_1 X1_2 X1_3 X1_4 X1_5 [1,]« Джон »« да »« да »NA NA NA [2,]« Peter »" да "" да "" да "NA NA [3,]" Steve "" yes "NA" yes "" yes "NA' Я пытаюсь получить вывод, который должен содержать: имя, пробелы, содержащие NA. См. Мои правки выше. –

+0

Ваша речь не согласуется с комментариями и сообщением выше. Вам нужен вывод, который дает «True» для каждого имени, содержащего NA? Или NA и пробел? Какой формат должен содержать выход? Не могли бы вы вывести точный пример вывода, который вы ожидаете, если найдете решение? Редактировать: Спасибо! – David

ответ

1

Это data.table решение:

require(data.table) 
df<-data.frame(list(names = c("John", "Peter", "Steve"), 
       '1_1' = c("yes", "yes","yes"), 
       '1_2' = c("yes", "yes", ""), 
       '1_3' = c("", "yes", "yes"), 
       '1_4' = c("", "","yes"), 
       '1_5' = c(NA, NA, NA)), 
      row.names = NULL) 
dt <- as.data.table(df) 
# Instead of using gsub, have a function that sets values True 
# if the cell value != 'yes' or is NA. 
dt.i <- dt[, lapply(.SD, function(x) x != 'yes' | is.na(x)), by=names] 
# See dt.i: 
# names X1_1 X1_2 X1_3 X1_4 X1_5 
# 1: John FALSE FALSE TRUE TRUE TRUE 
# 2: Peter FALSE FALSE FALSE TRUE TRUE 
# 3: Steve FALSE TRUE FALSE FALSE TRUE 
dt.i[, list(list(names(.SD)[which(.SD == T)])), by=names] 

Урожайность

names    V1 
1: John X1_3,X1_4,X1_5 
2: Peter  X1_4,X1_5 
3: Steve  X1_2,X1_5 

Если вы храните эту структуру как

dt.final <- dt.i[, list(list(names(.SD)[which(.SD == T)])), by=names]

Вы можете получить доступ к информации по , например.

dt.final[names == 'John'] 
# names    V1 
# 1: John X1_3,X1_4,X1_5 
dt.final[names == 'John']$V1 
# [[1]] 
# [1] "X1_3" "X1_4" "X1_5" 
+0

Большое спасибо @David. –

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