【问题标题】:How to count the presence of unique elements from each row of data set and list them in r如何计算每行数据集中唯一元素的存在并将它们列出在r中
【发布时间】:2019-11-19 19:59:21
【问题描述】:

我有一个如下数据集:

Age      Monday Tuesday Wednesday 
6-9        a     b        
6-9        b     a        c
6-9              c        a
9-10       c     c        b
9-10       c     a        b

使用 R,我想得到以下数据集/结果(其中 1 表示元素存在,0 表示不存在):

Age        a     b        c
6-9        1     1        0
6-9        1     1        1
6-9        1     0        1
9-10       0     1        1
9-10       1     1        1

【问题讨论】:

  • 你需要的是虚拟数据吗?
  • 对于每个观察,我需要每个独特元素的存在或不存在。
  • 这里有几个相关的想法:stackoverflow.com/q/18474896/5325862。您可能需要创建一个 ID 变量才能重塑

标签: r


【解决方案1】:

这可以通过melt 完成,然后通过table 创建频率计数

library(reshape2)
df['New']=row.names(df)
s=melt(df,c('Age','New'))
s=as.data.frame.matrix(table(s$New,s$value))
s$Age=df$Age
s
  a b c  Age
1 1 1 0  6-9
2 1 1 1  6-9
3 1 0 1  6-9
4 0 1 2 9-10
5 1 1 1 9-10

【讨论】:

  • @denis 很高兴我能帮上忙 :-) 祝你有美好的一天
  • 你也可以通过 base R data.frame(df[1], as.data.frame.matrix(table(data.frame(1:nrow(df), stack(df[-1])[1])))) 实现它:)
【解决方案2】:

pivot_longerpivot_wider 的一个选项

library(dplyr)
library(tidyr)
df1 %>%
   mutate(rn = row_number()) %>% 
   pivot_longer(cols = -c(Age, rn)) %>%
   filter(value != '')  %>% 
   select(-name) %>%
   distinct %>%
   mutate(val = 1) %>%
   pivot_wider(names_from = value, values_from = val, 
            values_fill = list(val = 0)) %>%
   select(-rn)
# A tibble: 5 x 4
#  Age       a     b     c
#  <chr> <dbl> <dbl> <dbl>
#1 6-9       1     1     0
#2 6-9       1     1     1
#3 6-9       1     0     1
#4 9-10      0     1     1
#5 9-10      1     1     1

数据

df1 <- structure(list(Age = c("6-9", "6-9", "6-9", "9-10", "9-10"), 
    Monday = c("a", "b", "", "c", "c"), Tuesday = c("b", "a", 
    "c", "c", "a"), Wednesday = c("", "c", "a", "b", "b")),
    class = "data.frame", row.names = c(NA, 
-5L))

【讨论】:

  • 我收到 select(-name) 错误。 select(., -name) 中的错误:未使用的参数 (-name)
【解决方案3】:

data.table 解决方案,使用 ID 变量;

library(data.table)
library(magrittr)
df <- setDT(df)

ag = function(x){if(length(x>1)){1}else{length(x)}}

df[,idx:=.I][]%>%
  melt(id.vars = c("Age","idx")) %>%
  .[,.(Age,value,idx)]%>%
  dcast(Age+idx~value,fun.aggregate = ag)%>%
  .[,-c("idx","NA")]


    Age a b c
1:  6-9 1 1 0
2:  6-9 1 1 1
3:  6-9 1 0 1
4: 9-10 0 1 1
5: 9-10 1 1 1

数据:

df <- read.table(text = "Age      Monday Tuesday Wednesday 
6-9        a     b        NA
6-9        b     a        c
6-9       NA     c        a
9-10       c     c        b
9-10       c     a        b",header = T)

【讨论】:

  • 非常感谢您的帮助。但是,它不仅仅是给我每行每个唯一元素的存在或不存在,而是给我每行唯一元素的总数。如果您建议我如何才能获得每行每个唯一元素的存在或不存在,将不胜感激?
  • 嗬,对,我没有意识到,对不起。我编辑了我的答案,但我认为 WeNYoBen anser 的答案更好更简单。
猜你喜欢
  • 2021-08-04
  • 2021-02-03
  • 2018-12-08
  • 2021-07-25
  • 2021-07-31
  • 2019-07-23
  • 2021-10-24
  • 2021-03-29
  • 2022-01-15
相关资源
最近更新 更多