【问题标题】:R Turning list characters into other listsR将列表字符转换为其他列表
【发布时间】:2016-11-04 13:55:02
【问题描述】:

我无法重现我的数据,因此我将提供类似的样本数据:

lst1 <- list(IT = c("Training", "Helpdesk"), Construction = c("Water", "Waste"))
lst2 <- list(Training = c("Alarm Engineer", "Backend Engineer"),
             Helpdesk = c("Analyst 1", "Analyst 2"),
             Water = c("Water 1", "Water 2"),
             Waste = c("Waste 1", "Waste 2", "Waste 3"))
lst3 <- list(`Alarm Engineer` = head(mtcars), `Backend Engineer` = head(VADeaths),
             `Analyst 1` = head(diamonds), `Analyst 2` = head(ChickWeight),
             `Water 1` = head(state.x77), `Water 2` = head(iris),
             `Waste 1` = head(CO2), `Waste 2` = head(cbind(letters, LETTERS)),
             `Waste 3` = state.abb)

首先(lst1)我有一个长度为 35 的小嵌套列表:

head(dis_sub, 2)         
$IT
 [1] "Web Developer"         "Web Designer"          "Training"              "Testing"               "Technician"            "Technical Support"    
 [7] "Systems Engineer"      "Systems Analyst"       "Helpdesk"     

$Construction

 [1] "Water"                     "Waste"                     "Sustainability"            "Structural Engineer"       "Skilled Trades"           
 [6] "Site Manager"              "Mechanical and Electrical" 

然后我有第二个长度为 250 (lst2) 的嵌套列表:

head(sub_jobs, 2)
$Mechanical and Electrical

    [1] "Alarm Engineer"          "Backend Engineer"     "Biomass Engineer"                         
  [4] "Building Engineer"         "Cam Engineer"       "Electrician" 

$Helpdesk

 [1] "1st Line Analyst"                 "1st Line Desktop Support Analyst" "1st Line Engineer"                "1st Line Helpdesk"               
 [5] "1st Line Helpdesk Support"    "1st Line IT Support"    "1st Line IT 

然后我有一个最终列表(lst3),这个列表是一个数据框列表,所有数据框都有一个公共变量,但有不同数量的观察:

   head(list_all, 2)
$Electrician
                              words
1                     17th edition 
2       17th edition qualification 
3           17th edition qualified 
4                          3 phase 
5                     access point 

$1st Line Helpdesk Support
                                        words
1                 1st line technical support 
2                      2nd line support team 
3                 2nd line technical support 

现在您可能已经发现,在第一个列表中,我们在 IT 下看到了帮助台。在建设中,我们看到机械和电气

我想把这些从字符变成列表二中的列表。

然后,我们在机械和电气下的列表 2 中看到电工,在帮助台下,我们看到 1st Line Helpdesk Support。然后,我希望将这些字符转换为列表 3 中的 data.frames。

列出我制作的清单并从那里开始可能对我来说很愚蠢。我显然可以制作 35 和 250 的简单列表,而且我也有一个数据框,例如:

dis           sub       norm
IT            Helpdesk  1st Line Helpdesk Support
IT            Helpdesk  Analyst
IT            Testing   Tester
Construction  Mech...   Electrician 
Construction  Mech..    Alarm Engineer 
Construction  Waste     Recycling Engineer

然后是一个充满 csv 的文件夹,每个文件夹都以上面的每个规范行命名,并包含用于制作列表 3 中 data.frames 列表的 data.frames。

我想要的是:

>List
$IT
   Helpdesk
            1st Line Helpdesk Support
                    1                 1st line technical support 
                    2                      2nd line support team 
                    3                 2nd line technical support
                    ...
            Analyst
                    ...
            ...
   Web developer
            ...
                    ...
   ...

$Construction
             Mechanical and Electrical
                             Electrician
                                     1                     17th edition 
                                     2       17th edition qualification 
                                     3           17th edition qualified

【问题讨论】:

  • 有人能解释为什么这会收到反对票吗?我认为我很清楚,并提供了我的数据示例供其他人复制?
  • 试试lapply(dis_sub, function(x) lapply(sub_jobs[x], function(.x) list_all[.x]))
  • 它确实有效。我可以给你看。
  • 那是因为你的名字不完全匹配。例如,您在一个列表中有Mechanical &amp; Electrical,在另一个列表中有Mechanical and Electrical
  • 你说得对,我很抱歉,我没有删除 list_all 中的空格,所以该列表中的名称与 dis_sub 和 sub_jobs 不匹配,这解释了我的空值。

标签: r list dataframe nested-lists


【解决方案1】:

我们可以嵌套一个子集。

lapply(lst1, function(x) lapply(lst2[x], function(.x) lst3[.x]))

数据

lst1 <- list(IT = c("Training", "Helpdesk"), Construction = c("Water", "Waste"))
lst2 <- list(Training = c("Alarm Engineer", "Backend Engineer"),
             Helpdesk = c("Analyst 1", "Analyst 2"),
             Water = c("Water 1", "Water 2"),
             Waste = c("Waste 1", "Waste 2", "Waste 3"))
lst3 <- list(`Alarm Engineer` = head(mtcars), `Backend Engineer` = head(VADeaths),
             `Analyst 1` = head(diamonds), `Analyst 2` = head(ChickWeight),
             `Water 1` = head(state.x77), `Water 2` = head(iris),
             `Waste 1` = head(CO2), `Waste 2` = head(cbind(letters, LETTERS)),
             `Waste 3` = state.abb)

输出

lapply(lst1, function(x) lapply(lst2[x], function(.x) lst3[.x]))
$IT
$IT$Training
$IT$Training$`Alarm Engineer`
                   mpg cyl disp  hp drat    wt  qsec vs am gear carb
Mazda RX4         21.0   6  160 110 3.90 2.620 16.46  0  1    4    4
Mazda RX4 Wag     21.0   6  160 110 3.90 2.875 17.02  0  1    4    4
Datsun 710        22.8   4  108  93 3.85 2.320 18.61  1  1    4    1
Hornet 4 Drive    21.4   6  258 110 3.08 3.215 19.44  1  0    3    1
Hornet Sportabout 18.7   8  360 175 3.15 3.440 17.02  0  0    3    2
Valiant           18.1   6  225 105 2.76 3.460 20.22  1  0    3    1

$IT$Training$`Backend Engineer`
      Rural Male Rural Female Urban Male Urban Female
50-54       11.7          8.7       15.4          8.4
55-59       18.1         11.7       24.3         13.6
60-64       26.9         20.3       37.0         19.3
65-69       41.0         30.9       54.6         35.1
70-74       66.0         54.3       71.1         50.0


$IT$Helpdesk
$IT$Helpdesk$`Analyst 1`
# A tibble: 6 × 10
  carat       cut color clarity depth table price     x     y     z
  <dbl>     <ord> <ord>   <ord> <dbl> <dbl> <int> <dbl> <dbl> <dbl>
1  0.23     Ideal     E     SI2  61.5    55   326  3.95  3.98  2.43
2  0.21   Premium     E     SI1  59.8    61   326  3.89  3.84  2.31
3  0.23      Good     E     VS1  56.9    65   327  4.05  4.07  2.31
4  0.29   Premium     I     VS2  62.4    58   334  4.20  4.23  2.63
5  0.31      Good     J     SI2  63.3    58   335  4.34  4.35  2.75
6  0.24 Very Good     J    VVS2  62.8    57   336  3.94  3.96  2.48

$IT$Helpdesk$`Analyst 2`
  weight Time Chick Diet
1     42    0     1    1
2     51    2     1    1
3     59    4     1    1
4     64    6     1    1
5     76    8     1    1
6     93   10     1    1

【讨论】:

  • 是 .x 与 i 或 y 相同(任何虚拟)还是与更高级别循环中的 x 有某种关系?
  • 它是任意的,不与其他任何东西相关联。只是一个虚构的名字
  • 还有我的问题的哪一部分不好,我不想要反对票并将对其进行编辑
  • 我不知道他们为什么拒绝它。也许添加dput(head(sub_jobs)) 和其他列表,以便有人可以轻松剪切和粘贴数据以尝试不同的解决方案。
  • 快问,我如何跳过关卡。例如 TEST$Retail$Project Manager[1] 给了我敏捷项目经理及其数据框,而 TEST$Retail$Project Manager[[1]] 只返回数据框。如果我想向后工作并从所有数据框中提取所有单词,是否有一种简单的方法可以喜欢:for(i in TEST$*$*[[i]]){print(i)}
猜你喜欢
  • 2018-10-14
  • 2020-11-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-04-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多