Doug Fir
Doug Fir

Reputation: 21204

Write a list to a data frame then csv but with 2 columns

I have a list "cluster_features", here's what it looks like:

> cluster_features[1:3]
$cluster1
           dui        control         physic     dui_physic physic_control        alcohol 
        281673          10759          10756          10756          10756           2917 

$cluster2
         investig              auto     investig_auto             death    death_investig          non-crim 
            41964             17445             17445              2815              2815               920 
investig_non-crim              fire     fire_investig 
              920               580               503 

$cluster3
         assist           agenc    agenc_assist    assist_other          public        motorist motorist_assist 
          98605           29118           18968           16655           16107           10261            8354 
           fire   assist_public          servic   public_assist            call         general  general_assist 
           7047            6952            6105            5679            5642            5630            5306 
    servic_call             cad     assist_fire          escort   assist_escort   escort_servic 
           5303            5259            4965            4954            4954            4954 

Generated by:

dput(cluster_features[1:3])
structure(list(cluster1 = structure(c(281673, 10759, 10756, 10756, 
10756, 2917), .Names = c("dui", "control", "physic", "dui_physic", 
"physic_control", "alcohol")), cluster2 = structure(c(41964, 
17445, 17445, 2815, 2815, 920, 920, 580, 503), .Names = c("investig", 
"auto", "investig_auto", "death", "death_investig", "non-crim", 
"investig_non-crim", "fire", "fire_investig")), cluster3 = structure(c(98605, 
29118, 18968, 16655, 16107, 10261, 8354, 7047, 6952, 6105, 5679, 
5642, 5630, 5306, 5303, 5259, 4965, 4954, 4954, 4954), .Names = c("assist", 
"agenc", "agenc_assist", "assist_other", "public", "motorist", 
"motorist_assist", "fire", "assist_public", "servic", "public_assist", 
"call", "general", "general_assist", "servic_call", "cad", "assist_fire", 
"escort", "assist_escort", "escort_servic"))), .Names = c("cluster1", 
"cluster2", "cluster3"))

My goal is to export to csv with the data in a similar format. That is, perhaps columnA is the key then column b all the values of the key. So it looks like e.g. this: enter image description here

I tried this:

x <- do.call("rbind", lapply(cluster_features, as.data.frame))

But the results place everything into one column like so:

head(x)
                        X[[i]]
cluster1.dui            281673
cluster1.control         10759
cluster1.physic          10756
cluster1.dui_physic      10756
cluster1.physic_control  10756
cluster1.alcohol          2917

Is there a way to export my list as a csv in the format in the screen shot? Keys in one column, values in another?

Upvotes: 1

Views: 24

Answers (1)

Z.Lin
Z.Lin

Reputation: 29075

If I understand correctly, you have a list of named vectors, & you want to convert each vector into a 2-column data frame of names & values. Try this:

result <- lapply(seq_along(cluster_features), 
                 function(i){data.frame(source = paste0("cluster", i), 
                                        key = names(cf[[i]]), 
                                        value = cf[[i]])}) %>%
  data.table::rbindlist()

> head(result)
     source            key  value
1: cluster1            dui 281673
2: cluster1        control  10759
3: cluster1         physic  10756
4: cluster1     dui_physic  10756
5: cluster1 physic_control  10756
6: cluster1        alcohol   2917

If you don't need to distinguish the source, you can skip the first column in the data frame.

Upvotes: 1

Related Questions