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