R 将行中的值按类似列分组
我有一个列,里面有多个值。。 像 我将数据与R 将行中的值按类似列分组,r,dataframe,R,Dataframe,我有一个列,里面有多个值。。 像 我将数据与 Species_Data2 <- data.frame(str_split_fixed(Species_Data$Other.Anopheline.species, ",", 21)) 我想制作一个数据帧,如: X1 X2 X3 X4 X5 X6 X7 X8 A B C D E F G NA A
Species_Data2 <- data.frame(str_split_fixed(Species_Data$Other.Anopheline.species, ",", 21))
我想制作一个数据帧,如:
X1 X2 X3 X4 X5 X6 X7 X8
A B C D E F G NA
A B C NA E F G NA
A NA C D NA F G T
然后。。。。
我想将列名称设置为行值:-
科尔曼
'A' 'B' 'C' 'D' 'E' 'F' 'G' 'T'
A B C D E F G NA
A B C NA E F G NA
A NA C D NA F G T
尝试创建排序…但效果不太好…:(
如果我理解正确,OP希望重新排列数据,以便每个字母都有一个单独的列。如果一行中有字母,则该字母将出现在重塑数据的相应列/行中。
NA
表示一行中缺少一个字母。此外,字母列应按顺序排列字母顺序
1.dplyr
/tidyr
进近
如果我们从OP调用stringr::str_split_fixed()生成的data.frame开始
我们需要将拆分后的数据从宽格式改为长格式,删除空条目,对行进行排序,使列按字母顺序显示,然后再次改为宽格式。要进行改形,需要行id。要获得所需的输出,pivot\u wide()
必须调用names\u from=value
参数:
library(dplyr)
library(tidyr)
as.data.frame(stringr::str_split_fixed(DF$ColumnX1, ",", 21)) %>%
mutate(rn = row_number()) %>%
pivot_longer(-rn) %>%
filter(value != "") %>%
arrange(as.character(value)) %>%
pivot_wider(rn, names_from = value)
此处显示了重复字母的数量
通过使用unique()
,在重塑之前删除重复值,可以恢复预期的行为:
具有重复值的数据
DF2您还没有包括这些后面的逻辑。在顶部添加了后面的逻辑。仍然不清楚您希望如何从第一个版本转换到第二个版本,或者您尝试了什么。我在每行中都有重复的值…因此给出了“0”和“1”。但我想我可以接受这一点:)。。。。再次感谢再次感谢你…我很快就会和你分享我所做的
'A' 'B' 'C' 'D' 'E' 'F' 'G' 'T'
A B C D E F G NA
A B C NA E F G NA
A NA C D NA F G T
library(dplyr)
library(tidyr)
as.data.frame(stringr::str_split_fixed(DF$ColumnX1, ",", 21)) %>%
mutate(rn = row_number()) %>%
pivot_longer(-rn) %>%
filter(value != "") %>%
arrange(as.character(value)) %>%
pivot_wider(rn, names_from = value)
rn A B C D E F G T
<int> <fct> <fct> <fct> <fct> <fct> <fct> <fct> <fct>
1 1 A B C D E F G NA
2 2 A B C NA E F G NA
3 3 A NA C D NA F G T
library(data.table)
setDT(DF)[, stringr::str_split(ColumnX1, ","), by = 1:nrow(DF)][, dcast(.SD, nrow ~ V1)]
nrow A B C D E F G T
1: 1 A B C D E F G <NA>
2: 2 A B C <NA> E F G <NA>
3: 3 A <NA> C D <NA> F G T
DF <- data.frame(ColumnX1 = c("A,D,C,B,F,E,G",
"F,A,B,E,G,C",
"C,D,G,F,A,T")
)
library(data.table)
setDT(DF2)[, stringr::str_split(ColumnX1, ","), by = 1:nrow(DF)][, dcast(.SD, nrow ~ V1)]
nrow A B C D E F G T
1: 1 1 1 2 1 1 1 1 0
2: 2 1 1 1 0 1 2 1 0
3: 3 1 0 1 1 0 1 1 1
setDT(DF2)[, stringr::str_split(ColumnX1, ","), by = 1:nrow(DF)][
, dcast(unique(.SD), nrow ~ V1)]
nrow A B C D E F G T
1: 1 A B C D E F G <NA>
2: 2 A B C <NA> E F G <NA>
3: 3 A <NA> C D <NA> F G T
library(dplyr)
library(tidyr)
as.data.frame(stringr::str_split_fixed(DF2$ColumnX1, ",", 21)) %>%
mutate(rn = row_number()) %>%
pivot_longer(-rn) %>%
filter(value != "") %>%
arrange(as.character(value)) %>%
pivot_wider(rn, names_from = value, values_fn = list(value = unique))
DF2 <- data.frame(ColumnX1 = c("A,D,C,B,F,E,G,C",
"F,A,B,E,G,C,F",
"C,D,G,F,A,T")
)