R 通过多个列定义的因子的一个热编码?

R 通过多个列定义的因子的一个热编码?,r,dataframe,dplyr,multiple-columns,one-hot-encoding,R,Dataframe,Dplyr,Multiple Columns,One Hot Encoding,我正在尝试不同的科学期刊聚类方法,我有一个数据框架,具有以下结构: 'data.frame': 30883 obs. of 11 variables: $ Title : chr "CA - A Cancer Journal for Clinicians" "MMWR. Recommendations and reports : Morbidity and mortality weekly report. Recommendations an

我正在尝试不同的科学期刊聚类方法,我有一个数据框架,具有以下结构:

'data.frame':   30883 obs. of  11 variables:
 $ Title        : chr  "CA - A Cancer Journal for Clinicians" "MMWR. Recommendations and reports : Morbidity and mortality weekly report. Recommendations and reports / Centers for Disease Co"| __truncated__ "Nature Reviews Materials" "Quarterly Journal of Economics" ...
 $ ISSN1        : chr  "15424863" "10575987" "20588437" "00335533" ...
 $ ISSN2        : chr  "00079235" "15458601" NA "15314650" ...
 $ SubCat1      : chr  "Hematology" "Epidemiology" "Biomaterials" "Economics and Econometrics " ...
 $ SubCat2      : chr  "Oncology " "Health Information Management" "Electronic, Optical and Magnetic Materials" NA ...
 $ SubCat3      : chr  NA "Health social science" "Energy" NA ...
 $ SubCat4      : chr  NA "Health, Toxicology and Mutagenesis" "Materials Chemistry" NA ...
 $ SubCat5      : chr  NA "Medicine " "Surfaces, Coatings and Films " NA ...
 $ SubCat6      : chr  NA NA NA NA ...
 $ Top.Level    : chr  "Health Sciences" "Health Sciences" "Physical Sciences and Engineering" "Social Sciences and Humanities" ...
 $ Primary.Level: chr  NA NA NA NA ...
我的问题是SubCat列中的元素没有特定的顺序,这意味着,例如,肿瘤学可能会出现在这6列中的任何一列中,即使它是相同的类别,尽管列号不同。例如,let's day SubCat1有136个不同的术语,但其中80个与SubCat4相同,后者有240个不同的术语。总的来说,两个列的级别都高达136+240-80个不同的因子

我想对所有6个子类别列进行1-hot-encode编码,因此在所有6个子类别列中,每个不同的因子都有一列(无论它出现在多个列中,我都希望它有一个单独的列)。我试图避免通过for和dplyr操作手动编程所有内容,但到目前为止,我还没有找到任何直接的方法(我通常会在所有六列的组合中得到每列1hotcod,这意味着大量重复列)

有什么优雅的方法可以解决这个问题吗?也许我在问一些明显的问题,但我还没有找到

谢谢

编辑:“肿瘤学”中有一些重复的行:


您可以使用
pivot\u longer
将您的猫放入一列,然后使用
pivot\u wide
及其
values\u fn
values\u fill
参数计算相应的类别,而不会丢失其他列:

库(tidyverse)
(df#A tibble:10 x 4
#>标题ISSN SubCat1 SubCat2
#>             
#>1 a 7361068 a K
#>2B7988851BL
#>3立方厘米8771863立方厘米
#>北纬146888度
#>5 e 9104811 e O
#>6楼3612300 f P
#>7克3242950克Q
#>8小时1225062小时R
#>9 i 6462332 i S
#>10 j 7363583 j T
至少一个0,
1.
0)
}
df%>%
pivot_更长(匹配('SubCat'),
名称\u to='subcat',
值_to='category')%>%
pivot_更宽(名称_from='category',
值_from='subcat',
值\u fn=至少一个,
值(填充=0)
#>#tibble:10 x 22
#>标题为A K B L C M D N E O
#>                 
#>1A736106811000
#>2B798885100100
#>3 c 8771863 0 0 0 1 0 0 0 0 0
#>4 d 1468800 01 0 0 0
#>5 e 9104811 0 0 0 0 1 1
#>6楼3612300
#>7 g 3242950 0 0 0 0
#>8小时1225062 0 0 0 0
#>9 i 6462332 0 0 0 0
#>10 j 7363583 0 0 0 0
#>#…还有10个变量:F,P,G,Q,H,
#>#R,I,S,J,T

对不起,我肯定我在问一些明显的问题,但是当我应用建议的代码时,它在控制台上运行得非常好,但是结果不会存储在df中。我的意思是,控制台输出如下(我想要的):

#tible:29407x1082
标题ISSN1 ISSN2顶级初级血液学`肿瘤学`非流行病学`健康信息…
1 CA-A…15424…00079…健康S…NA 110 0
2毫米总重。R…10575…15458…健康S…NA 0 0 1 1 1
3自然…20588…自然…自然…自然
4季度…00335…15314…社会S…NA 0 0 1 0 0
5自然…14710…14710…健康S…NA 0 0 1 0 0
6国家…15518…15518…社会S…NA 0 0 1 0 0
7自然…14710…14710…健康S…NA 0 0 1 0 0
8细胞00928…10974…生命科学…生物化学
但是df仍然只显示环境中的11列。此外,如果我写df[1],我会得到:

df[1,]
                                 Title    ISSN1    ISSN2    SubCat1   SubCat2 SubCat3 SubCat4 SubCat5
1 CA - A Cancer Journal for Clinicians 15424863 00079235 Hematology Oncology     None    None    None
  SubCat6       Top.Level Primary.Level
1    None Health Sciences          <NA>
df[1,]
标题ISSN1 ISSN2 SUBAT1 SUBAT2 SUBAT3 SUBAT4 SUBAT5
1 CA-临床医生癌症杂志15424863 00079235血液肿瘤无
SubCat6顶层主要层
1非健康科学
但是如果我使用dput(df[1,]),我会得到全部内容(1082列)。 我做错什么了吗?在我应用代码之后,df中到底是什么?我的计划是根据SubCat列对行进行集群,因此我需要以某种方式将它们传递给算法,但我不能像df[I,]

对不起,如果这是显而易见的,但它从来没有发生在我身上。
谢谢你的帮助

str()。您能否找到几行(不超过10行)来说明问题,即它们在不同的子类别列中有一些重叠的元素,并以可复制粘贴的方式共享该数据
dput()
制作R对象的副本/可粘贴版本:
dput(您的数据[选定的行])
。谢谢!,我试试看是否对我有用。我看到的数据的唯一区别是价值
# A tibble: 29,407 x 1,082
   Title    ISSN1  ISSN2  Top.Level Primary.Level Hematology `Oncology `  None Epidemiology `Health Informa…
   <chr>    <chr>  <chr>  <fct>     <chr>              <dbl>       <dbl> <dbl>        <dbl>            <dbl>
 1 CA - A … 15424… 00079… Health S… NA                     1           1     1            0                0
 2 MMWR. R… 10575… 15458… Health S… NA                     0           0     1            1                1
 3 Nature … 20588… NA     Physical… NA                     0           0     1            0                0
 4 Quarter… 00335… 15314… Social S… NA                     0           0     1            0                0
 5 Nature … 14710… 14710… Health S… NA                     0           0     1            0                0
 6 Nationa… 15518… 15518… Social S… NA                     0           0     1            0                0
 7 Nature … 14710… 14710… Health S… NA                     0           0     1            0                0
 8 Cell     00928… 10974… Life Sci… Biochemistry…          0           0     1            0                0
df[1,]
                                 Title    ISSN1    ISSN2    SubCat1   SubCat2 SubCat3 SubCat4 SubCat5
1 CA - A Cancer Journal for Clinicians 15424863 00079235 Hematology Oncology     None    None    None
  SubCat6       Top.Level Primary.Level
1    None Health Sciences          <NA>