r为什么summary()与分组和NA一样失败

  • 本文关键字:NA 失败 一样 summary
  • 更新时间 :
  • 英文 :


更新如下

当我尝试在我创建的likert对象faceLikertG:上运行summary()时,我得到了错误"替换有4行,数据有2行"

#  Group              Item    angry  neutral    happy
#1  boys             child 19.54023 48.27586 32.18391
#2  boys primary caregiver 27.58621 36.78161 35.63218
#3 girls             child 35.18519 31.48148 33.33333
#4 girls primary caregiver 33.94495 32.11009 33.94495
#5  <NA>             child  0.00000  0.00000  0.00000
#6  <NA> primary caregiver  0.00000  0.00000  0.00000

我认为这个问题可能有关联,但我不确定。

faceLikertG <- structure(list(results = structure(list(Group = structure(c(1L, 
1L, 2L, 2L, NA, NA), .Label = c("boys", "girls"), class = "factor"), 
    Item = structure(c(1L, 2L, 1L, 2L, 1L, 2L), .Label = c("child", 
    "primary caregiver"), class = "factor"), angry = c(19.5402298850575, 
    27.5862068965517, 35.1851851851852, 33.9449541284404, 0, 
    0), neutral = c(48.2758620689655, 36.7816091954023, 31.4814814814815, 
    32.1100917431193, 0, 0), happy = c(32.183908045977, 35.632183908046, 
    33.3333333333333, 33.9449541284404, 0, 0)), .Names = c("Group", 
"Item", "angry", "neutral", "happy"), row.names = c(NA, -6L), class = "data.frame"), 
    items = structure(list(child = structure(c(2L, 2L, 1L, 2L, 
    3L, 3L, 2L, 3L, 3L, 2L, 3L, 1L, 1L, 3L, 3L, 3L, 2L, 2L, 1L, 
    1L, 1L, 1L, 3L, 2L, 2L, 3L, NA, 2L, 3L, 2L, 2L, 3L, 2L, 3L, 
    3L, 3L, 2L, 3L, 3L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 3L, 1L, 
    1L, 2L, 1L, 2L, 2L, 3L, 1L, 1L, 1L, 2L, 3L, 2L, 2L, 1L, 3L, 
    2L, 3L, 3L, 3L, 2L, 1L, 2L, 3L, 1L, 3L, 2L, 2L, 1L, 2L, 1L, 
    2L, 3L, 2L, 3L, 1L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 1L, 1L, 3L, 
    1L, 3L, 3L, 2L, 3L, 1L, 2L, 2L, 3L, 2L, 1L, 2L, 3L, 1L, 2L, 
    1L, 2L, 1L, NA, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 1L, 3L, 3L, 2L, 
    2L, 2L, 3L, 1L, 1L, 2L, 3L, 1L, 3L, 2L, 1L, 1L, 3L, 3L, 3L, 
    3L, 3L, 1L, 3L, 1L, 3L, 1L, 3L, 2L, 3L, 3L, 1L, 2L, 2L, 3L, 
    2L, NA, 2L, 3L, 2L, 1L, 2L, 2L, 1L, 1L, 3L, 1L, 3L, 2L, 2L, 
    2L, 2L, 1L, 2L, 2L, 3L, 2L, 3L, 1L, 3L, 2L, 1L, 2L, NA, 2L, 
    1L, 2L, 1L, 1L, 3L, 2L, 3L, 3L, 2L, 1L, 2L, 2L, 2L, 1L, 2L
    ), .Label = c("angry", "neutral", "happy"), class = "factor"), 
        `primary caregiver` = structure(c(3L, 1L, 1L, 3L, 3L, 
        3L, 3L, 3L, 3L, 3L, 1L, 2L, 2L, 2L, 2L, 3L, 2L, 2L, 1L, 
        1L, 2L, 3L, 1L, 1L, 2L, 2L, NA, 1L, 3L, 3L, 1L, 2L, 1L, 
        2L, 3L, 3L, 2L, 2L, 3L, 2L, 1L, 2L, 1L, 1L, 2L, 1L, 1L, 
        3L, 1L, 2L, 1L, 1L, 3L, 3L, 2L, 2L, 2L, 2L, 1L, 1L, 3L, 
        2L, 1L, 1L, 1L, 3L, 3L, 2L, 1L, 1L, 3L, 1L, 3L, 3L, 2L, 
        3L, 3L, 2L, 1L, 3L, 1L, 3L, 3L, 2L, 3L, 3L, 2L, 2L, 3L, 
        1L, 1L, 1L, 3L, 3L, 2L, 2L, 1L, 3L, 3L, 1L, 1L, 2L, 1L, 
        1L, 1L, 2L, 3L, 3L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 1L, 3L, 
        2L, 2L, 3L, 1L, 3L, 3L, 2L, 2L, 2L, 3L, 2L, 2L, 1L, 3L, 
        2L, 3L, 1L, 2L, 1L, 3L, 3L, 3L, 3L, 3L, 3L, 3L, 1L, 1L, 
        2L, 2L, 1L, 3L, 3L, 1L, 3L, 1L, 1L, 3L, NA, 1L, 1L, 2L, 
        2L, 2L, 2L, 1L, 3L, 2L, 2L, 3L, 3L, 3L, 2L, 1L, 1L, 2L, 
        1L, 3L, 2L, 3L, 1L, 2L, 2L, 1L, 2L, NA, 1L, 1L, 3L, 2L, 
        2L, 3L, 2L, 3L, 2L, 2L, 2L, 3L, 3L, 3L, 1L, 2L), .Label = c("angry", 
        "neutral", "happy"), class = "factor")), .Names = c("child", 
    "primary caregiver"), row.names = c("1", "61", "121", "181", 
    "241", "301", "361", "421", "481", "541", "601", "661", "721", 
    "781", "841", "901", "961", "1024", "1084", "1144", "1204", 
    "1324", "1387", "1450", "1510", "1570", "1630", "1690", "1750", 
    "1810", "1870", "1993", "2053", "2113", "2173", "2233", "2296", 
    "2356", "2419", "2479", "2542", "2602", "2662", "2722", "2782", 
    "2842", "2902", "2962", "3022", "3082", "3142", "3202", "3262", 
    "3322", "3382", "3442", "3502", "3562", "3622", "3682", "3742", 
    "3802", "3862", "3922", "3982", "4042", "4102", "4162", "4282", 
    "4342", "4405", "4465", "4525", "4588", "4648", "4708", "4768", 
    "4828", "4888", "4948", "5008", "5068", "5128", "5188", "5248", 
    "5308", "5368", "5428", "5488", "5548", "5608", "5668", "5728", 
    "5788", "5848", "5908", "5968", "6028", "6088", "6148", "6208", 
    "6268", "6328", "6388", "6448", "6508", "6568", "6628", "6688", 
    "6748", "6808", "6871", "6931", "6991", "7051", "7111", "7177", 
    "7237", "7303", "7363", "7423", "7483", "7543", "7603", "7666", 
    "7726", "7789", "7849", "7909", "7969", "8029", "8089", "8149", 
    "8209", "8269", "8329", "8389", "8449", "8509", "8575", "8635", 
    "8695", "8755", "8815", "8875", "8935", "8995", "9055", "9115", 
    "9175", "9235", "9295", "9355", "9415", "9475", "NA", "9537", 
    "9597", "9657", "9717", "9777", "9837", "9897", "9960", "10020", 
    "10080", "10140", "10200", "10260", "10320", "10380", "10440", 
    "10500", "10560", "10620", "10680", "10743", "10803", "10866", 
    "10926", "10986", "11046", "11106", "11166", "11226", "11286", 
    "11346", "11406", "11466", "11526", "11586", "11646", "11706", 
    "11766", "11826", "11886", "11946", "12006", "12066"), class = "data.frame"), 
    grouping = structure(c(2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 
    1L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 1L, 
    1L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 2L, 
    1L, 1L, 2L, 2L, 1L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, 1L, 
    2L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 
    2L, 1L, 1L, 2L, 2L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 2L, 2L, 2L, 
    2L, 1L, 1L, 2L, 1L, 2L, 2L, 2L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 
    1L, 2L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 
    1L, 1L, 1L, 1L, 1L, 1L, 2L, 2L, 2L, 1L, 1L, 2L, 1L, 1L, 1L, 
    1L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 1L, 2L, 1L, 
    2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 1L, 2L, 2L, NA, 1L, 2L, 2L, 
    2L, 2L, 2L, 1L, 2L, 1L, 2L, 1L, 1L, 1L, 1L, 1L, 2L, 1L, 2L, 
    2L, 1L, 1L, 2L, 2L, 2L, 2L, 1L, 2L, 1L, 1L, 1L, 2L, 2L, 2L, 
    1L, 2L, 2L, 2L, 2L, 2L, 1L, 2L, 2L, 1L), .Label = c("boys", 
    "girls"), class = "factor"), factors = NULL, nlevels = 3L, 
    levels = c("angry", "neutral", "happy")), .Names = c("results", 
"items", "grouping", "factors", "nlevels", "levels"), class = "likert")

会话:

#> sessionInfo()
#R version 3.3.0 (2016-05-03)
#Platform: x86_64-apple-darwin13.4.0 (64-bit)
#Running under: OS X 10.11.5 (El Capitan)
#locale:
#[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8
#attached base packages:
#[1] parallel  stats     graphics  grDevices utils     datasets  methods  
#[8] base     
#other attached packages:
# [1] likert_1.3.3 ......

更新

这里有一个更好的例子来说明这个问题。该错误是由分组变量中的NA触发的。我不确定这是一个错误,还是应该通过限制分组变量的完整情况来解决的问题。

library(likert)
library(plyr)
df <- data.frame(v1=c(1, 0, 1, 0, 1, 1, 0, 1),
                 v2=c(1, NA, 1, 0, 1, 1, 0, 1),
                 grp=c("a", "b", "a", NA, "a", "b", "a", "b"))
df[,1:2] <- lapply(df[,1:2],
                   factor, 
                   levels=c(0,1), 
                   labels=c("incorrect", "correct"))
df$grp <- factor(df$grp, 
                 levels=c("a", "b"),
                 labels=c("a", "b"))
dfLikert <- likert(df[,1:2], grouping=df$grp)
summary(dfLikert)
plot(dfLikert, low.color="blue", high.color="green",
     neutral.color="grey90", text.size=1.75) +
        theme(axis.text.y=element_text(colour="darkgrey", size=10),
        strip.text=element_text(colour="black", size=10))

问题是,当您调用summary时,它调用的是summary.likert,它(正如您正确指出的)不能处理NA,而summary.likert.hackr可以。

pacman::p_load(likert)
library(plyr)
df <- data.frame(v1=c(1, 0, 1, 0, 1, 1, 0, 1),
                 v2=c(1, NA, 1, 0, 1, 1, 0, 1),
                 grp=c("a", "b", "a", NA, "a", "b", "a", "b"))
df[,1:2] <- lapply(df[,1:2],
                   factor, 
                   levels=c(0,1), 
                   labels=c("incorrect", "correct"))
df$grp <- factor(df$grp, 
                 levels=c("a", "b"),
                 labels=c("a", "b"))
df$v1  <- addNA(df$v1)
df$v2  <- addNA(df$v2)
df$grp <- addNA(df$grp)
dfLikert <- likert(df[,1:2], grouping=df$grp)
source("https://raw.githubusercontent.com/hack-r/summary.likert.hackr/master/summary.likert.hackr.R")
summary.likert.hackr(dfLikert)
  Group Item      low neutral      high     mean        sd
1     a   v1 25.00000       0  75.00000 1.750000 0.5000000
2     a   v2 25.00000       0  75.00000 1.750000 0.5000000
3     b   v1 33.33333       0  66.66667 1.666667 0.5773503
4     b   v2  0.00000       0 100.00000 2.000000 0.0000000
5  <NA>   v1  0.00000       0   0.00000       NA        NA
6  <NA>   v2  0.00000       0   0.00000       NA        NA
>

我更改的功能的关键部分是(这是新版本):

for(g in unique(results$Group[!is.na(results$Group)])) {
  if(length(lowrange) == 1) {
    results2[which(results2$Group == g),]$low <-
      results[results$Group == g & !(is.na(results$Group)), lowrange + 2]
  } else {
    results2[which(results2$Group == g),]$low = apply(
      results[results$Group == g& !(is.na(results$Group)), lowrange + 2], 1, sum)
  }
  if(length(highrange) == 1) {
    results2[which(results2$Group == g),]$high <-
      results[results$Group == g& !(is.na(results$Group)), highrange + 2]
  } else {
    results2[which(results2$Group == g),]$high = apply(
      results[results$Group == g& !(is.na(results$Group)),highrange + 2], 1, sum)
  }
  if(lowrange[length(lowrange)] + 1 != highrange[1]) {
    results2[which(results2$Group == g),]$neutral <- 
      results[results$Group == g& !(is.na(results$Group)), (highrange[1] - 1 + 2)]
  }
  for(i in names(items)) {
    results2[which(results2$Group == g & results2$Item == i), 'mean'] = 
      mean(as.numeric(items[which(object$grouping == g), i]), na.rm=TRUE)
    results2[which(results2$Group == g & results2$Item == i), 'sd'] = 
      sd(as.numeric(items[which(object$grouping == g), i]), na.rm=TRUE)
  }
}

这是可行的,但我添加的后一个is.na测试现在可能会被删除,因为我已经把它放在了unique语句中。不过它们不会伤害任何东西。

最新更新