r - 在R中的数据框列表中拆分列
问题描述
我有一个数据框列表,其中某些列具有此特殊字符->(箭头)。现在我确实想遍历这个数据框列表并用这个->(箭头)定位列,然后用后缀_old和_new命名新列。这是数据帧的示例:
dput(df1)
df1 <- structure(list(v1 = c("reg->joy", "ress", "mer->dls"),
t2 = c("James","Jane", "Egg")),
class = "data.frame", row.names = c(NA, -3L))
dput(df2)
df2 <- structure(list(v1 = c("me", "df", "kl"),
t2 = c("James","Jane->dlt", "Egg"),
t3 = c("James ->may","Jane", "Egg")),
class = "data.frame", row.names = c(NA, -3L))
dput(df3)
df3 <- structure(list(v1 = c("56->34", "df23-> ", "mkl"),
t2 = c("James","Jane", "Egg"),
d3 = c("James->","Jane", "Egg")),
class = "data.frame", row.names = c(NA, -3L))
这是我尝试过的
dfs <- list(df1,df2,df3)
for (y in 1:length(dfs)){
setDT(dfs[[y]])
df1<- lapply(names(dfs[[y]]), function(x) {
mDT <- df2[[y]][, tstrsplit(get(x), " *-> *")]
if (ncol(mDT) == 2L) setnames(mDT, paste0(x, c("_old", "_new")))
}) %>% as.data.table()
}
这只会拆分一个数据帧,我需要拆分所有数据帧
预期输出
dput(df1)
df1 <- structure(list(v1_old = c("reg", "mer"),
v1_new = c("joy", "dls")),
class = "data.frame", row.names = c(NA, -3L))
dput(df2)
df2 <- structure(list(t2_old = c("dlt"),
t2_new = c("dlt"),
t3_old = c("James"),
t3_new = c("may")),
class = "data.frame", row.names = c(NA, -3L))
dput(df3)
df3 <- structure(list(v1_old = c("56", "df23 "),
v1_new = c("34", " "),
d3 = c("James"),
d3 = c(" ")),
class = "data.frame", row.names = c(NA, -3L))
解决方案
所以我玩了一圈,找到了答案
df1 <-c()
for (y in 1:length(dfs)){
setDT(dfs[[y]])
df1[[y]] <- lapply(names(modifiedtbl[[y]]), function(x) {
mDT <- dfs[[y]][, tstrsplit(get(x), " *-> *")]
if (ncol(mDT) == 2L) setnames(mDT, paste0(x, c("_old", "_new")))
}) %>% as.data.table()
}
推荐阅读
- python - 如何制作一个没有重复数字且第一个数字必须为 0 的 4 位数字?
- sql - Hive:使用平均函数和最频函数进行分组
- python - 尝试更改 Python .kv 文件中按钮上的文本
- php - PHP将复选框值传递给js然后传递给其他php
- css - 内联搜索栏实现 CSS
- java - JavaFX:如何制作一个 VBox 及其内容随着窗口高度无限扩展,就像它们对宽度一样?
- npm - 通过 npm 安装后找不到 composer 版本
- c++ - 部署 Qt 应用程序时遇到问题
- regex - 如何使用正则表达式获取字符串中的方法/函数
- azure-ad-b2c - Azure AD B2C 作为 SAML IdP - RelayState 太大