R:使用id和记录频率创建新的数据帧

R:使用id和记录频率创建新的数据帧,r,dataframe,matrix,count,frequency,R,Dataframe,Matrix,Count,Frequency,例如,我有一个如下表: ID A B C D 1234 cat 0 dog 0 1234 0 new dog 0 5678 0 new dog hi 0101 cat 0 0 hi 我如何得到这样一张桌子: ID word 1234 cat 1234 dog 1234 new 1234

例如,我有一个如下表:

ID         A     B     C     D
1234       cat   0     dog   0
1234       0     new   dog   0
5678       0     new   dog   hi
0101       cat   0     0     hi
我如何得到这样一张桌子:

ID        word
1234      cat
1234      dog
1234      new
1234      dog
5678      new
5678      dog
5678      hi
0101      cat
0101      hi

非常感谢你的帮助

强烈建议您在StackOverflow中加入自己解决问题的尝试。考虑到这个问题有很多很多解决方案,这里有一个潜在的解决方案:

df <- tibble::tribble(
    ~ID, ~A, ~B, ~C, ~D,
   "1234", "cat", "0", "dog", "0",
   "1234", "0",  "new",  "dog", "0",
  "5678", "0", "new", "dog", "hi",
  "0101", "cat", "0", "0", "hi")

df2 <- df %>% 
  pivot_longer(cols = -c(ID)) %>% 
  filter(value != "0") %>% 
  select(ID, value) %>% 
  rename("word" = "value")

df2
#> ID    word 
#>1 1234  cat  
#>2 1234  dog  
#>3 1234  new  
#>4 1234  dog  
#>5 5678  new  
#>6 5678  dog  
#>7 5678  hi   
#>8 0101  cat  
#>9 0101  hi   
df%
过滤器(值!=“0”)%>%
选择(ID,值)%>%
重命名(“单词”=“值”)
df2
#>ID字
#>1234猫
#>21234狗只
#>31234新
#>41234狗
#>55678新
#>65678只狗
#>75678嗨
#>81001猫
#>9 0101嗨

这可以简单地写为:

pivot_longer(`is.na<-`(df, df==0), -ID, values_to = "word",values_drop_na = TRUE)
# A tibble: 9 x 3
  ID    name  word 
  <chr> <chr> <chr>
1 1234  A     cat  
2 1234  C     dog  
3 1234  B     new  
4 1234  C     dog  
5 5678  B     new  
6 5678  C     dog  
7 5678  D     hi   
8 0101  A     cat  
9 0101  D     hi 
pivot_更长(`is.na%
`是。na%
轴长(-ID,values\u to=“word”,values\u drop\u na=TRUE)
对于base R,如果您不关心结果的排序(当然可以排序),那么您可以使用:

na.omit(cbind(df[1], stack(`is.na<-`(df, df==0), -1)))
     ID values ind
1  1234    cat   A
4  0101    cat   A
6  1234    new   B
7  5678    new   B
9  1234    dog   C
10 1234    dog   C
11 5678    dog   C
15 5678     hi   D
16 0101     hi   D
na.omit(cbind(df[1],stack(`is.na)查看而不是编写“
is.na
na.omit(cbind(df[1], stack(`is.na<-`(df, df==0), -1)))
     ID values ind
1  1234    cat   A
4  0101    cat   A
6  1234    new   B
7  5678    new   B
9  1234    dog   C
10 1234    dog   C
11 5678    dog   C
15 5678     hi   D
16 0101     hi   D