我需要根据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列分隔,而是按空格分隔。
答案 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