【问题标题】:R factor levels as column names and count valuesR 因子级别作为列名和计数值
【发布时间】:2018-09-21 02:16:04
【问题描述】:

我希望将不同变量的因子级别作为列名,并将每个 PatID 的计数作为值。 我有的是这样的:

data_sample <- data.frame(
  PatID   = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L),
  status1 = c("I250", "NA", "NA", "X560", "M206", "NA", "NA", "M206", "NA"),
  status2 = c(".", "M206", "NA", "I250", "I250", "M206", "NA", "NA", "X560"),
  status3 = c(".", "I250", "NA", "NA", "NA", "I250", "X560", "NA", "NA")
)

我想要的是以下内容:

PatID I250 M206 X560
  1     2    1   0
  2     2    1   1
  3     1    2   2

有人可以帮忙吗?我尝试了 dcast 和其他人,但结果从未出现

【问题讨论】:

  • 使用“data.table”,您可以执行以下操作:library(data.table); melt(as.data.table(data_sample), measure.vars = patterns("^status"))[!value %in% c(".", "NA"), dcast(.SD, PatID ~ value)]。

标签: r


【解决方案1】:
data_sample <- data.frame(
  PatID   = c(1L, 1L, 1L, 2L, 2L, 3L, 3L, 3L, 3L),
  status1 = c("I250", "NA", "NA", "X560", "M206", "NA", "NA", "M206", "NA"),
  status2 = c(".", "M206", "NA", "I250", "I250", "M206", "NA", "NA", "X560"),
  status3 = c(".", "I250", "NA", "NA", "NA", "I250", "X560", "NA", "NA")
)

library(tidyverse)
data_sample %>%
  gather(status_num, value, -PatID) %>%
  filter(value != "NA", value != ".") %>%
  count(PatID, value) %>%  # Improvement by @antoniosk 
  spread(value, n, fill = 0)

# A tibble: 3 x 4
# Groups:   PatID [3]
  PatID  I250  M206  X560
  <int> <int> <int> <int>
1     1     2     1    NA
2     2     2     1     1
3     3     1     2     2

【讨论】:

    猜你喜欢
    • 2015-02-10
    • 1970-01-01
    • 2016-03-26
    • 1970-01-01
    • 1970-01-01
    • 2014-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多