R将列表字符转换为其他列表

时间:2016-11-04 13:55:02

标签: r list dataframe nested-lists

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

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中我们有电工,在帮助台下我们看到第一线帮助台支持。然后,我希望将这些字符转换为列表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文件夹,每个文件夹都以上面的每个norm行命名,并包含data.frames,用于生成列表3中的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

1 个答案:

答案 0 :(得分:1)

我们可以嵌套一个子集。

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

<强>输出

var result = AnswersSort.MarkedAnswer | AnswersSort.MostVotes | AnswersSort.Bounty;
result = AnswersSort.MostVotes | AnswersSort.Bounty | AnswersSort.MarkedAnswer;