在 R 中拆分 "the middle" 中的列
split columns in "the middle" in R
我有一个示例数据框:
df_1 <- as.data.frame(cbind(c(14, 27, 38), c(25, 33, 52), c(85, 12, 23)))
现在,我想将所有这些列从中间分开,这样我就可以得到如下所示的内容:
df_2 <- as.data.frame(cbind(c(1, 2, 3), c(4, 7, 8), c(2,3,5), c(5, 3, 2), c(8, 1, 2), c(5, 2, 3)))
那么我的问题是:是否有 command/package 可以自动执行此操作?
在我的真实数据框中,我希望通过名称拆分列,从早期的回归中我通过插入获得名称:
paste0(names(df)[i], "~", names(df)[j])
进入我的循环。
然而,我的想法是,一旦我为上面给出的数据帧找到正确的命令,这将非常容易。
提前致谢!
您可以在基数 R:
中使用 strsplit
as.data.frame(t(apply(df_1, 1, \(x) as.numeric(unlist(strsplit(as.character(x), ""))))))
V1 V2 V3 V4 V5 V6
1 1 4 2 5 8 5
2 2 7 3 3 1 2
3 3 8 5 2 2 3
另一个可能的解决方案:
library(tidyverse)
map(df_1, ~ str_split(.x, "", simplify = T)) %>% as.data.frame %>%
`names<-`(str_c("V", 1:ncol(.))) %>% type.convert(as.is = T)
#> V1 V2 V3 V4 V5 V6
#> 1 1 4 2 5 8 5
#> 2 2 7 3 3 1 2
#> 3 3 8 5 2 2 3
感谢您的回答,他们提供了很多帮助!
我最终使用 tidyr
包和命令:
test <- as.data.frame(separate(data = test, col = "V1", into = c("col_1", "col_2"), sep = "\~"))
这对我很有用,因为我 运行 早些时候进行了回归并且有一个很好的分离运算符:“~”
A base R
,选项是使用 read.fwf
v1 <- do.call(paste0, df_1)
read.fwf(textConnection(v1), widths = rep(1, max(nchar(v1))))
-输出
V1 V2 V3 V4 V5 V6
1 1 4 2 5 8 5
2 2 7 3 3 1 2
3 3 8 5 2 2 3
另一种选择是使用 splitstackshape
包:
df_2 <- df_1 %>%
splitstackshape::cSplit(., names(.), sep = "", stripWhite = F, type.convert = F) %>%
setnames(paste0("V", 1:ncol(.)))
输出
df_2
V1 V2 V3 V4 V5 V6
1: 1 4 2 5 8 5
2: 2 7 3 3 1 2
3: 3 8 5 2 2 3
我有一个示例数据框:
df_1 <- as.data.frame(cbind(c(14, 27, 38), c(25, 33, 52), c(85, 12, 23)))
现在,我想将所有这些列从中间分开,这样我就可以得到如下所示的内容:
df_2 <- as.data.frame(cbind(c(1, 2, 3), c(4, 7, 8), c(2,3,5), c(5, 3, 2), c(8, 1, 2), c(5, 2, 3)))
那么我的问题是:是否有 command/package 可以自动执行此操作?
在我的真实数据框中,我希望通过名称拆分列,从早期的回归中我通过插入获得名称:
paste0(names(df)[i], "~", names(df)[j])
进入我的循环。
然而,我的想法是,一旦我为上面给出的数据帧找到正确的命令,这将非常容易。
提前致谢!
您可以在基数 R:
中使用strsplit
as.data.frame(t(apply(df_1, 1, \(x) as.numeric(unlist(strsplit(as.character(x), ""))))))
V1 V2 V3 V4 V5 V6
1 1 4 2 5 8 5
2 2 7 3 3 1 2
3 3 8 5 2 2 3
另一个可能的解决方案:
library(tidyverse)
map(df_1, ~ str_split(.x, "", simplify = T)) %>% as.data.frame %>%
`names<-`(str_c("V", 1:ncol(.))) %>% type.convert(as.is = T)
#> V1 V2 V3 V4 V5 V6
#> 1 1 4 2 5 8 5
#> 2 2 7 3 3 1 2
#> 3 3 8 5 2 2 3
感谢您的回答,他们提供了很多帮助!
我最终使用 tidyr
包和命令:
test <- as.data.frame(separate(data = test, col = "V1", into = c("col_1", "col_2"), sep = "\~"))
这对我很有用,因为我 运行 早些时候进行了回归并且有一个很好的分离运算符:“~”
A base R
,选项是使用 read.fwf
v1 <- do.call(paste0, df_1)
read.fwf(textConnection(v1), widths = rep(1, max(nchar(v1))))
-输出
V1 V2 V3 V4 V5 V6
1 1 4 2 5 8 5
2 2 7 3 3 1 2
3 3 8 5 2 2 3
另一种选择是使用 splitstackshape
包:
df_2 <- df_1 %>%
splitstackshape::cSplit(., names(.), sep = "", stripWhite = F, type.convert = F) %>%
setnames(paste0("V", 1:ncol(.)))
输出
df_2
V1 V2 V3 V4 V5 V6
1: 1 4 2 5 8 5
2: 2 7 3 3 1 2
3: 3 8 5 2 2 3