根据地图合并文件

时间:2017-06-28 09:27:05

标签: r merge data-manipulation

我需要根据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 |
+-------+-----+---------------------------------------------------------------+

创建一个空数据框不是问题,只是想知道如何遍历文件。重要的是,原始文件不是3列分隔,而是按空格分隔。

1 个答案:

答案 0 :(得分:0)

有很多方法可以实现字符串到虚拟变换,但是有一个名为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