我收到的数据中包含需要拆分/分离的字段,如以下简化虚构(仅列出2个此类字段,但可能有2个、10个或无字段,并非所有字段都必须分离):
df <- data.frame( MgrID = c("111A", "111B", "111C"),
Empl = c("ATL\\Sam", "ATL\\Sarah", "MNL\\Ethel"),
Desk = c("ATL\\D123", "HOM\\H1", "MNL\\M456")
)
为了拆分它们,我有一个列表,其中包含需要拆分的字段和拆分后应该使用的新名称(见下面的示例):
# ID which fields need to be separated within df above and what the new fields should be
L1 <- c(Empl), c("City", "Name"))
L2 <- c(Desk), c("Site", "Location"))
ToSep <- list(L1, L2)
上面创建的“ToSep”列表在完成时将如下所示:
ToSep
[[1]]
[1] "Empl" "City" "Name"
[[2]]
[1] "Desk" "Site" "Location"
并且本质上是需要拆分的内容和新列名应该是什么的对(例如,将“员工”列拆分成“城市”和“姓名”列)。
我可以使用下面的for循环来分离字段并将其重新组合到现有的 Dataframe 中:
df1 <- df # Creating temp df to use inside for loop
for (i in 1:length(ToSep)) {
# Separate selected fields for each i
df2 <- df %>%
separate(ToSep[[i]][1], ToSep[[i]][-1], "\\\\", remove = FALSE, fill="left")
# Merge current df1 with new df2 (df holding the split fields)
df1 <- merge(
df1,
df2,
by = colnames(df),
all = TRUE
)
}
df <- df1
这看起来有点笨拙,我想一定有一种方法可以简化,使更容易理解/更快/更好/更聪明/等等...
3条答案
按热度按时间e0bqpujr1#
像这样的东西,也许?
或者更简单地说:
我注意到你的代码保持了原来的列不分隔。如果你仍然想要这样,试试这个:
数据
disho6za2#
我们可以将
purrr
包中的reduce
与left_join()
结合使用。1.对于
reduce()
,我们迭代地将相同的函数应用于要分离的列的列表。1.此函数使用
separate()
将列分隔为新的列名left_join()
将结果 Dataframe 与原始 Dataframe 结合。1.最后,使用
.init
参数初始化原始 Dataframe 的缩减e5nqia273#
基本上使用
strsplit
。