【问题标题】:how add values in a data frame after a for loop?for循环后如何在数据框中添加值?
【发布时间】:2021-08-05 00:19:56
【问题描述】:

我有一个包含 ID 列和值列的数据集,我运行了 Shapiro Wilk 测试,以检查 ID 列中不同值在值列中的值的正态性。我想要做的是创建一个有 4 列的数据框。第一个是 ID 的名称,第二个是 W 值,第三个是 p 值。第四列将具有非正常/正常值或根据 p 值接受 H1。这是输出

dput(df)
structure(list(ID = c("F1", "F1", "F1", "F1", "F1", "F1", "F1", 
"F2", "F2", "F2", "F2", "F2", "F2", "F2", "F2", "F3", "F3", "F3", 
"F3", "F3", "F3", "F3", "F3", "F3", "F4", "F4", "F4", "F4", "F4", 
"F4", "F4", "F4"), Values = c(9.6, NA, 10.2, 9.8, 9.9, 9.9, 9.9, 
1.2, 1.2, 1.8, 1.5, 1.5, 1.6, 1.4, NA, 3266, 3256, 7044, 6868, 
NA, 3405, 3410, NA, 5567, 59.4, 56, 52.8, 52.4, 55.5, NA, NA, 
53.6)), class = "data.frame", row.names = c(NA, -32L))

这是我迄今为止所做的,目的是运行所有 ID 的测试并努力创建一个数据框。

install.packages("data.table")
library(data.table)

uniq_id <- unique(df$ID)

number_loops <- length(uniq_id)

headings <- c("ID", "Wilk", "p_value","Accept H1")



df_table <- as.data.frame(matrix(NA, nrow = (number_loops ), ncol = length(headings)))



for(i in unique(df$ID)){
  u <- setDT(df)[ID == i]
  s <- shapiro.test(u$Values)
  print(i)
  print(s)
}

【问题讨论】:

标签: r dataframe for-loop


【解决方案1】:

考虑by 按列的唯一值对数据进行子集化,并对每个子集运行一个函数,您可以在其中运行所需的测试并将结果提取到data.table。然后,将所有数据子集结果绑定在一起:

dt_list <- by(df, df$ID, function(sub) {
    results <- shapiro.test(sub$Values)

    data.table(
        ID = sub$ID[1],
        Wilk = results$statistic,
        p_value = results$p.value,
        accept_H1 = results$p.value <= 0.05
   )
})

dt_table <- data.table::rbindlist(dt_list)

【讨论】:

    猜你喜欢
    • 2019-11-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-14
    • 2011-10-02
    • 2019-12-26
    • 1970-01-01
    相关资源
    最近更新 更多