2017-11-13 4 views
1

リストの列をリストから外す方法と、データフレームのリストの列の値から新しい列を追加する方法。下のリストを参考にしてください。リスト列の値から新しい列を追加する方法

私のデータフレーム。

Status  AuditResult            Deship          Item 

Active list(DDID=c("2","First"),Dvalue=c("Bpin","67")) list(UserID=1,Add="Stet,Bpin") list(Menu=1,Bill=9,Deship =list(list(IDesc ="A",vendor=5))) 

Inactive list(DDID=c("Second","8"),Dvalue=c("CA","98")) list(UserID=2,Add="Stet,Bpin") list(Menu=1,Bill=8,Deship =list(list(IDesc ="B,N,O",vendor=4))) 

OnHold list(DDID=c("78","8",NA),Dvalue=c("UK","76")) list(UserID=1,Add="Stet,Bpin") list(Menu=1,Bill=7,Deship =list(list(IDesc ="L,q",vendor=2))) 

予想されるデータフレーム。

Status DDID   Dvalue   UserID Add   Menu Bill IDesc vendor 

Active "2","First" "Bpin","67" 1  "Stet,Bpin" 1  9  "A"  5 

Inactive "Second","8" "CA","98"  2  "Stet,Bpin" 1  8  "B,N,O" 4 

OnHold "78","8",NA "UK","76"  1  "Stet,Bpin" 1  7  "L,q"  2 

非構造化コードがあれば教えてください。

Dput。

structure(list(Status = c("Active", "Inactive", "OnHold"), AuditResult = list(
    structure(list(DDID = c(2, "First"), Dvalue = c("Bpin", 
    67)), .Names = c("DDID", "Dvalue"), class = "data.frame", row.names = 1:2), 
    structure(list(DDID = c("Second", 8), Dvalue = c("CA", 
    98)), .Names = c("DDID", "Dvalue"), class = "data.frame", row.names = 1:2), 
    structure(list(DDID = c("78","8",NA), Dvalue = c("UK", 
    76)), .Names = c("DDID", "Dvalue"), class = "data.frame", row.names = 1:2)), 
    Deship = list(structure(list(UserID = 1, Add = "Stet, Bpin"), .Names = c("UserID", 
    "Add"), class = "data.frame", row.names = 1L), structure(list(
     UserID = 2, Add = "Stet, Bpin"), .Names = c("UserID", 
    "Add"), class = "data.frame", row.names = 1L), structure(list(
     UserID = 1, Add = "Stet, Bpin"), .Names = c("UserID", 
    "Add"), class = "data.frame", row.names = 1L)), Item = list(
structure(list(Menu = 1, Bill = 9.0, Deship = list(
      structure(list(IDesc = "A", vendor = 5), .Names = c("IDesc", 
      "vendor"), class = "data.frame", row.names = 1L))), .Names = c("Menu", 
     "Bill", "Deship"), class = "data.frame", row.names = 1L), 
     structure(list(Menu = 1, Bill = 8.0, Deship = list(
      structure(list(IDesc = "B,N,O", vendor = 4), .Names = c("IDesc", 
      "vendor"), class = "data.frame", row.names = 1L))), .Names = c("Menu", 
     "Bill", "Deship"), class = "data.frame", row.names = 1L), 
     structure(list(Menu = 1, Bill = 7.0, Deship = list(
      structure(list(IDesc = "L,q", vendor = 2), .Names = c("IDesc", 
      "vendor"), class = "data.frame", row.names = 1L))), .Names = c("Menu", 
     "Bill", "Deship"), class = "data.frame", row.names = 1L))), .Names = c("Status", 
"AuditResult", "Deship", "Item"), row.names = c(NA, 
3L), class = "data.frame") 

答えて

2

リストの各列の構造が異なるため、それぞれの方法で処理する必要があります。

dfnew <- data.frame(df$Status, 
        do.call(rbind, lapply(df$AuditResult, function(x) sapply(x, toString))), 
        do.call(rbind, df$Deship), 
        do.call(rbind, lapply(df$Item, unlist))) 
names(dfnew) <- sub('^.*\\.','',names(dfnew)) 

います:ベースRで

> dfnew 
    Status  DDID Dvalue UserID  Add Menu Bill IDesc vendor 
1 Active 2, First Bpin, 67  1 Stet, Bpin 1 9  A  5 
2 Inactive Second, 8 CA, 98  2 Stet, Bpin 1 8 B,N,O  4 
3 OnHold 78, 8, NA UK, 76  1 Stet, Bpin 1 7 L,q  2 
+0

あなたの応答のおかげで、上記のコードはうまくいきますが、データフレームヘッダーName.isが "リスト"であることをチェックして動的に行う方法はありません。 – udya

+0

@udya 'sapply(df、class)'または 'sapply(df、is.list)' – Jaap

+0

ありがとう、同時に私は1つの問題に直面して、特殊文字(#)とスペースは(。 )私のリアルタイムリストのデータでは、私はdupヒストリアドレスとemp#を持っています。しかし、dup.history.addressとempを置き換えます。 – udya

0

データフレームの名前をdtとすると、ここにオプションがあります。

library(tidyverse) 

dt2 <- dt %>% 
    select(Status, AuditResult) %>% 
    mutate(DDID = map(AuditResult, ~.$DDID), 
     Dvalue = map(AuditResult, ~.$Dvalue)) %>% 
    mutate(DDID = map_chr(DDID, ~toString(.)), 
     Dvalue = map_chr(Dvalue, ~toString(.))) %>% 
    select(-AuditResult) 

dt3 <- dt %>% 
    select(Status, Deship) %>% 
    unnest() 

dt4 <- dt %>% 
    select(Status, Item) %>% 
    unnest() %>% 
    unnest() 

dt_final <- reduce(list(dt2, dt3, dt4), left_join, by = "Status") 
dt_final 
#  Status  DDID Dvalue UserID  Add Menu Bill IDesc vendor 
# 1 Active 2, First Bpin, 67  1 Stet, Bpin 1 9  A  5 
# 2 Inactive Second, 8 CA, 98  2 Stet, Bpin 1 8 B,N,O  4 
# 3 OnHold 78, 8, NA UK, 76  1 Stet, Bpin 1 7 L,q  2 
+0

を、応答のおかげで、その作業罰金が、DDIDは、Dvalue列クラスは、リターン "リスト" であり文字列を変更する可能性があります。グループ化操作を行うと、「リスト」タイプをサポートしていません。 – udya

+0

@udyaマイアップデートをご覧ください。現在、 'DDID'と' Dvalue'は文字列です。 – www

+0

、おかげさまで私はexpeted..onceとして働いてくれてありがとう... – udya

関連する問題