【问题标题】:filtering a list in R过滤R中的列表
【发布时间】:2015-10-19 06:27:45
【问题描述】:

我现在要在 R 中进行贝叶斯知识追踪,并且我的部分代码需要消除在给定 KC 上具有少于 3 个实例的学生,否则参数估计将不会收敛。为此,我目前有:

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)
}

【问题讨论】:

  • 你可能想看看这个link 关于一个最小的工作示例。如果您发布数据的一般结构,那将非常有帮助。 IE。 df &lt;- data.frame(Anon.Student.id = 1:10, Accuracy = rnorm(10)) 以便我们能够重现您的问题!

标签: r list filtering curve-fitting bayesian-networks


【解决方案1】:
library(dplyr)
new_kc <- one_kc %>%
    group_by(Anon.Student.id) %>%
    mutate(instances = n()) %>%
    filter(instances >= 3)

【讨论】:

  • 所以这行得通,但它改变了数据的存储方式,所以现在它不适用于我的程序的其余部分。有没有办法保持格式不变,但只取出少于 3 个实例的格式?
  • 现在,未经过滤,它是一个向量列表:df_subset$Accuracy
  • 这与您最初询问的问题不同,如果没有原始结构中的数据或其中的一部分,很难给出自信的答案。
  • 是的,这是有道理的。我将为您编辑我的原始帖子,并使用我的大部分代码。
  • 在没有示例数据的情况下,仅通过阅读代码就很难解决这个问题,但是您可以尝试对我的小代码块生成的数据重新运行 split() 操作,看看是否可行它。
【解决方案2】:

如果您需要加快代码速度,您还可以查看 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]

【讨论】:

  • 你可以只做setDT(new_kc)[, if(.N &gt;= 3) .SD, by = Anon.Student.id]。顺便说一句,您从哪里获得该数据集?
  • 数据集只是一个插入的 Excel 电子表格,格式为制表符分隔的 txt 文件。有没有办法在不使用新库的情况下做到这一点?因为这往往会以程序的其余部分无法处理的方式重新格式化数据
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-07-08
  • 2021-08-12
  • 1970-01-01
相关资源
最近更新 更多