无法将列表转换为数据框

时间:2017-04-18 13:49:56

标签: r list dataframe

我是R的编程新手,我已经有好几天了。我从一个列表开始,我是通过拆分文件创建的。此列表包含单行中的多个项目。

head(sales2)
> $`7143443`
>>[1] "SSS-U-CCXVCSS1"   "L-CCX-8GETTS-LIC"

>$`7208993`
>>[1] "NFFGSR4="  "1MV-FT-1="  "VI-NT/TE=" 

>$`7241758`
>>[1] "PW_SQSGG="

>$`9273628`
>>[1] "O1941-SE9" "CCO887VA-K9"    "2901-SEC/K9" "CO1941-C/K9"

>$`9371709`
>>[1] "HGR__SASS=" "WWQTTB0S-L" "WS-RRRT48FP" "WTTTF24PS-L" 
[5] "GEDQTT8TS-L"  "WD-SRNS-2S-L" 

>$`9830473`
>>[1] "SPA$FFSB0S"

我希望它转换为数据框,我用

x<-do.call(rbind, lapply(sales2,data.frame))

它会在数据框中转换,但它会像这样转换

> head(x,6)

                          id
> 7143443.1   "SSS-U-CCXVCSS1"

> 7143443.2   "L-CCX-8GETTS-LIC"

> 7208993.1    "NFFGSR4="  

> 7208993.2    "1MV-FT-1="  

> 7208993.3    "VI-NT/TE="

> 7241758      "PW_SQSGG="

我希望7143443的所有项目都在一行而不是多行

通过这个,我想计算一起包含2个项目的行数 例如“WS-C2960S-48TS-L”,“WS-C2960S-24TS-L”, 这两个元素有多少行? 你也可以说这些超过所有其他元素的概率。

1 个答案:

答案 0 :(得分:1)

我不确定你最终的期望输出是什么。但是以下脚本可以将列表转换为数据框。也许您可以从这个数据框开始分析。

# Create example list
sales2 <- list(`7143443` = c("SSS-U-CCXVCSS1", "L-CCX-8GETTS-LIC"),
            `7208993` = c("NFFGSR4=", "1MV-FT-1=", "VI-NT/TE="),
            `7241758` = "PW_SQSGG=",
            `9273628` = c("O1941-SE9", "CCO887VA-K9", "2901-SEC/K9", "CO1941-C/K9"),
            `9371709` = c("HGR__SASS=", "WWQTTB0S-L", "WS-RRRT48FP", "WTTTF24PS-L",
                          "GEDQTT8TS-L", "WD-SRNS-2S-L"),
            `9830473` = "SPA$FFSB0S")

# Load packages
library(dplyr)
library(purrr)

dat <- map(sales2, data_frame) %>%                    # Convert each list element to a data frame
  bind_rows(.id = "ID") %>%                           # Combine all data frame
  rename(Value = `.x[[i]]`) %>%                       # Change the name of the second column
  group_by(ID) %>%                                    # Group by the first column
  summarise(Value = paste0(Value, collapse = " "))    # Collapse the second column

dat
# A tibble: 6 × 2
       ID                                                                  Value
    <chr>                                                                  <chr>
1 7143443                                        SSS-U-CCXVCSS1 L-CCX-8GETTS-LIC
2 7208993                                           NFFGSR4= 1MV-FT-1= VI-NT/TE=
3 7241758                                                              PW_SQSGG=
4 9273628                          O1941-SE9 CCO887VA-K9 2901-SEC/K9 CO1941-C/K9
5 9371709 HGR__SASS= WWQTTB0S-L WS-RRRT48FP WTTTF24PS-L GEDQTT8TS-L WD-SRNS-2S-L
6 9830473                                                             SPA$FFSB0S

更新

在阅读原创海报评论后,我决定更新我的解决方案,计算包含两个指定字符串模式的行数。

其中一个row是唯一的ID。所以我假设请求可以改为&#34;有多少ID包含两个指定的字符串模式?&#34;如果是这种情况,我宁愿不要删除所有观察结果。因为在将所有观察结果从每行一个ID折叠之后,我们需要开发一个匹配字符串的策略,例如使用正则表达式。我不熟悉常规字符串,所以我会留给其他人提供解决方案。

此外,原始海报没有指定哪两个字符串是目标,所以我会制定一个策略,用户可以逐个替换目标字符串。

dat <- map(sales2, data_frame) %>%                    # Convert each list element to a data frame
  bind_rows(.id = "ID") %>%                           # Combine all data frame
  rename(Value = `.x[[i]]`)                           # Change the name of the second column

# After this, there is no need to collapse the rows

# Set the target string, User can change the strings here
target_string1 <- c("SSS-U-CCXVCSS1", "L-CCX-8GETTS-LIC")       

dat2 <- dat %>%
  filter(Value %in% target_string1) %>%               # Filter rows matching the targeted string
  distinct(ID, Value, .keep_all = TRUE) %>%           # Only keep one row if ID and Value have exact duplicated
  count(ID) %>%                                       # Count how many rows per ID
  filter(n > 1) %>%                                   # Keep only ID that the Count number is larger than 1
  select(ID)

dat2

# A tibble: 1 × 1
       ID
    <chr>
1 7143443