2015-07-28 4 views
1

В настоящее время я собираюсь отслеживать байесовские знания в R, а часть моего кода должна исключать студентов, которые имеют менее 3 экземпляров на данном KC, иначе оценки параметров не будут сходиться. Таким образом, чтобы сделать это, я в настоящее время:фильтрация списка в R

by_user = split(one_kc, one_kc$Anon.Student.id) 
obs_by_user = sapply(by_user, nrow) 
valid_users = names(obs_by_user[obs_by_user > 2]) 
student_outcomes = one_kc[one_kc$Anon.Student.id %in% valid_users,] 

Но по какой-то причине, когда я смотрю на by_user в моей среде, недопустимые пользователи все еще перечислены там, и если я пытаюсь запустить кривой фитинг, значение не сходятся, и я считаю, что это причина. Где я иду не так?

редактировать: здесь больше кода, что я работаю с в настоящее время:

df <- data.frame(read.table(file=file.choose(),na.strings="NA",sep="\t",quote="",header=TRUE, fill=TRUE)) 


df_subset <- df[,c(5,21,27,39,38)] 

df_subset$Accuracy <- as.numeric(as.vector(df_subset$Accuracy)) 

df_subset <- na.omit(df_subset) 

kc_list <- unique(df_subset$KC.Model.2A.) 
#loop on the kc_list 
for (kc in kc_list) 
    { 
    print(kc) 
    one_kc <- df_subset[ which(df_subset$KC.Model.2A.==kc), ] 
    one_kc <- one_kc[,c(1,3)] 
    # remove users with few observations on this skill 
    by_user = split(one_kc, one_kc$Anon.Student.id) 
    obs_by_user = sapply(by_user, nrow) 
    valid_users = names(obs_by_user[obs_by_user > 2]) 
    student_outcomes = one_kc[one_kc$Anon.Student.id %in% valid_users,] 

    by_good_user = split(student_outcomes$Accuracy, student_outcomes$Anon.Student.id) 
} 
+0

Возможно, вы захотите ознакомиться с этой [ссылкой] (http://stackoverflow.com/help/mcve) о минимальном рабочем примере. Было бы очень полезно, если бы вы опубликовали общую структуру своих данных. т.е. 'df <- data.frame (Anon.Student.id = 1:10, Точность = rnorm (10))' Чтобы мы могли воспроизвести вашу проблему! – David

ответ

0
library(dplyr) 
new_kc <- one_kc %>% 
    group_by(Anon.Student.id) %>% 
    mutate(instances = n()) %>% 
    filter(instances >= 3) 
+0

Итак, это работает, но оно изменяет способ хранения данных, поэтому теперь он не работает для остальной части моей программы. Есть ли способ сохранить форматирование одинаково, но просто вынуть те, у которых меньше трех экземпляров? – WaWi

+0

Какой формат вы используете? – ulfelder

+0

прямо сейчас, нефильтрованный, это список векторов: df_subset $ Точность <- as.numeric (as.vector (df_subset $ Accuracy)) – WaWi

1

Если вам нужно ускорить код, который вы также можете посмотреть в data.table пакет:

library(data.table) 
new_kc_dt <- as.data.table(new_kc) 

new_kc_dt[, instances := .N, by = Anon.Student.id][instances >= 3] 

# which is the same as 
new_kc_dt[, instances := .N, by = Anon.Student.id] 
new_kc_dt[instances >= 3] 
+2

Возможно, вы просто можете сделать 'setDT (new_kc) [, if (.N> = 3). SD, by = Anon.Student.id] '. Откуда вы взяли этот набор данных от кстати? –

+0

Набор данных - это просто вставленная таблица Excel, отформатированная как txt-файл с разделителями табуляции. Есть ли способ сделать это без использования новой библиотеки? причина имеет тенденцию переформатировать данные таким образом, что остальная часть программы не может обрабатывать – WaWi

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