【问题标题】:Can a column be a vector or list class?列可以是向量或列表类吗?
【发布时间】:2020-01-12 17:40:57
【问题描述】:

我正在处理一项调查中的多项响应问题,并且我有一个字符列,其中包含类似于“1,2,3”和“1,4,5”的值。参与者点击所有适用的值,我得到了这个结果。

解决此问题的最佳解决方案是什么?我是否应该创建新列来告诉我该列表中的值是否存在?或者我可以创建一个具有列表/向量类的列吗?

【问题讨论】:

  • 你想要的输出是什么?是的,一般情况下,您应该尽可能避免使用 CSV 数据。
  • 从技术上讲,是的,list-columns 可以在框架中工作(试试mtcars$new <- Map(c, mtcars$gear, mtcars$carb)),但是一些框架友好的工具并不总是对它们有很好的反应(尽管总是有解决方法)。一种不同的方法可能是以“长”格式存储不同的值,而不是将多个值存储在单个“单元格”中。这需要对其余数据进行重组,因此对于评论来说不够简单(并且需要一个可重现的问题)。
  • 将这些值转换为单独的行。 stackoverflow.com/questions/15347282/…
  • 真的取决于你的目标——你想用数据做什么?但是,是的,在大多数情况下,我同意 Ronak 的观点,单独的行是最简单的。
  • 如果您只有 5 个选项,那么有时创建 5 个仅 0/1 的列来表示该响应是否被勾选而不是单独的行是有意义的。所以你可以有Q1_aQ1_b等列,如果你用他们选择的实际名称替换ab,效果会更好。

标签: r list vector


【解决方案1】:

在不知道目的的情况下无法说出什么是最好的,但将它们存储为指标列,即每个选项一个 0/​​1 列,可以让您轻松执行回归或将它们制成表格。在这里,我们将x 转换为 0/1 矩阵m,然后考虑有多少受访者对每个问题的回答是肯定的,我们还以各种方式与他们进行回归,其中显示了两个,采用各种相关性和绘图。

我们还展示了一个基于将stack from 应用于列表表示的图,因此使用多个表示并在它们之间进行转换可能很有用。

x <- c("1,2,3", "1,4,5")
m <- t(+outer(1:5, lapply(strsplit(x, ","), as.numeric), Vectorize(`%in%`)))

colMeans(m)

y <- 1:2
lm(y ~ m+0)
lapply(1:5, function(i) glm(m[, i] ~ y, family = binomial()))

cor(m)
cor(t(m))

heatmap(m)

stk <- stack(setNames(lapply(strsplit(x, ","), as.numeric), seq_along(x)))
plot(stk)

这是一个具有 4 种不同可能性的数据框:

library(dst) # encode/decode

DF <- data.frame(x, stringsAsFactors = FALSE)
DF$list <- strsplit(x, ",")
DF <- cbind(DF, m, code = apply(m, 1, decode, base = 2))
DF
##       x     list  1 2 3 4 5  code
## 1 1,2,3  1, 2, 3  1 1 1 0 0    28
## 2 1,4,5  1, 4, 5  1 0 0 1 1    19

请注意,decode 将 0/1 值转换为数值,并且可以使用 encode 来反转它:

t(encode(base = rep(2, 5), c(28, 19)))
##   [,1] [,2] [,3] [,4] [,5]
## r    1    1    1    0    0
##      1    0    0    1    1

【讨论】:

    猜你喜欢
    • 2011-09-11
    • 2019-09-02
    • 1970-01-01
    • 1970-01-01
    • 2022-11-02
    • 1970-01-01
    • 2020-07-11
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多