【问题标题】:merge files into based on a map根据地图将文件合并到
【发布时间】:2017-06-28 09:27:05
【问题描述】:

我需要根据 ID 将多个文件合并到一个数据框中。最终数据框采用地图形式,ID 如下:

+-------+-----+-------------+-------------+---------------+
| Name  | ID  | CategoryID1 | CategoryID2 | CategoryID400 |
+-------+-----+-------------+-------------+---------------+
| name1 | ID1 |           0 |           1 |             0 |
| name2 | ID2 |           1 |           1 |             0 |
| name3 | ID3 |           0 |           0 |             0 |
| name4 | ID4 |           1 |           0 |             1 |
+-------+-----+-------------+-------------+---------------+

那些是二进制变量(类别),无论发生多少次,我都需要分配 1。我有带有列名的空数据框(地图),需要用从多个文件合并的数据填充它。

要合并并填充到一个文件中的数据文件如下所示。可以有回复,因此 2 个文件中的相同 ID 可能已分配了两个类别,但这并不重要,重要的是它出现并且 1 将分配给主数据框。

+-------+-----+---------------------------------------------------------------+
| name1 | ID1 | CategoryID1 CategoryID4                                       |
| name2 | ID2 | CategoryID1 CategoryID2 CategoryID9                           |
| name3 | ID4 | CategoryID150 CategoryID200 CategoryID400                     |
| name4 | ID4 | CategoryID1 CategoryID4 CategoryID7 CategoryID15 CategoryID89 |
+-------+-----+---------------------------------------------------------------+

创建一个空的数据框没有问题,只是想知道如何循环文件。重要的是原始文件被 \t 分隔为 3 列,但类别由空格分隔。

【问题讨论】:

  • 一步一步来: 1. 将所有文件读入单个数据框 - df1 <- rbindlist(lapply(list.files(), fread ....))) 2. 将选项卡和堆栈上的类别列分开。 3.然后获取唯一行,并将长格式转换为宽格式。

标签: r merge data-manipulation


【解决方案1】:

有很多方法可以实现字符串到假人的转换,但是有一个名为 splitstackshape 的库正好用于这些情况。有关示例,请参阅here。这里有一些代码可以满足您的需求:

install.packages("splitstackshape")
library(splitstackshape)

# Read your original file (be sure to store all data inside it)
# data <- read.delim(...)
data <- structure(list(name = c("name1", "name2", "name3", "name4"), 
               id = c("ID1", "ID2", "ID4", "ID4"), categories = c("CategoryID1 CategoryID4", 
                                                                  "CategoryID1 CategoryID2 CategoryID9", "CategoryID150 CategoryID200 CategoryID400", 
                                                                  "CategoryID1 CategoryID4 CategoryID7 CategoryID15 CategoryID89"
               )), .Names = c("name", "id", "categories"), class = "data.frame", row.names = c(NA, -4L))

#  name  id                                                     categories
#1 name1 ID1                                       CategoryID1 CategoryID4
#2 name2 ID2                           CategoryID1 CategoryID2 CategoryID9
#3 name3 ID4                     CategoryID150 CategoryID200 CategoryID400
#4 name4 ID4 CategoryID1 CategoryID4 CategoryID7 CategoryID15 CategoryID89


# create a dataframe with dummies
data_dummies <- cSplit_e(data, "categories",
              sep = " ",
              type = "character",
              drop = TRUE,
              fill = 0)

# Clear column names
colnames(data_dummies) <- gsub("categories_", "", colnames(data_dummies))

data_dummies

#   name  id CategoryID1 CategoryID15 CategoryID150 CategoryID2 CategoryID200 CategoryID4 CategoryID400 CategoryID7 CategoryID89 CategoryID9
#1 name1 ID1           1            0             0           0             0           1             0           0            0           0
#2 name2 ID2           1            0             0           1             0           0             0           0            0           1
#3 name3 ID4           0            0             1           0             1           0             1           0            0           0
#4 name4 ID4           1            1             0           0             0           1             0           1            1           0

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-07-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-12-29
    • 1970-01-01
    • 2019-09-12
    • 1970-01-01
    相关资源
    最近更新 更多