我在24小时内一直在寻找自己觉得很琐碎的问题(对我来说不是R的新手),这个问题尚未产生成果。所以请帮帮我。我有一个数据框,希望将其拆分为两个。这是数据的样子;
d1 d2 d3 d4 p1 p2 p3 p4
30 40 20 60 1 3 2 5
20 50 40 30 3 4 1 5
40 20 50 30 2 3 1 4
这是我想要的样子;
$d
d1 d2 d3 d4
30 40 20 60
20 50 40 30
40 20 50 30
$p
p1 p2 p3 p4
1 3 2 5
3 4 1 5
2 3 1 4
我已经在线尝试了大多数命令和示例,但是它们似乎都在沿行拆分数据,例如:
split(1:3, 1:2)
即使使用索引,我如何仍要从前四列中拆分出前四列?
答案 0 :(得分:6)
这是split
中base R
的一个选项
split.default(df1, sub('\\d+', '', names(df1)))
#$d
# d1 d2 d3 d4
#1 30 40 20 60
#2 20 50 40 30
#3 40 20 50 30
#$p
# p1 p2 p3 p4
#1 1 3 2 5
#2 3 4 1 5
#3 2 3 1 4
df1 <- structure(list(d1 = c(30L, 20L, 40L), d2 = c(40L, 50L, 20L),
d3 = c(20L, 40L, 50L), d4 = c(60L, 30L, 30L), p1 = c(1L,
3L, 2L), p2 = c(3L, 4L, 3L), p3 = c(2L, 1L, 1L), p4 = c(5L,
5L, 4L)), class = "data.frame", row.names = c(NA, -3L))
答案 1 :(得分:6)
使用sapply
和startsWith
:
sapply(c("d", "p"),
function(x) df[startsWith(names(df),x)],
simplify = FALSE)
# $d
# d1 d2 d3 d4
# 1 30 40 20 60
# 2 20 50 40 30
# 3 40 20 50 30
#
# $p
# p1 p2 p3 p4
# 1 1 3 2 5
# 2 3 4 1 5
# 3 2 3 1 4
tidyverse
的翻译:
library(tidyverse)
map(set_names(c("d", "p")),~select(df,starts_with(.x)))
# $d
# d1 d2 d3 d4
# 1 30 40 20 60
# 2 20 50 40 30
# 3 40 20 50 30
#
# $p
# p1 p2 p3 p4
# 1 1 3 2 5
# 2 3 4 1 5
# 3 2 3 1 4
答案 2 :(得分:3)
在基数R中,您可以使用grep
ss <- c("d", "p")
lapply(setNames(ss, ss), function(x) df[, grep(x, colnames(df))])
#$d
# d1 d2 d3 d4
#1 30 40 20 60
#2 20 50 40 30
#3 40 20 50 30
#
#$p
# p1 p2 p3 p4
#1 1 3 2 5
#2 3 4 1 5
#3 2 3 1 4
df <- read.table(text =
"d1 d2 d3 d4 p1 p2 p3 p4
30 40 20 60 1 3 2 5
20 50 40 30 3 4 1 5
40 20 50 30 2 3 1 4", header = T)
答案 3 :(得分:2)
这是使用tidyverse
的一种方法。
library(tidyverse)
df %>% gather(ind, values) %>%
split(., gsub("[0-9]", "", df_td$ind)) %>%
map(function(x) {
x %>%
group_by(ind) %>%
mutate(id = row_number()) %>%
spread(ind, values) %>%
select(-1)})
# $d
# # A tibble: 3 x 4
# d1 d2 d3 d4
# <int> <int> <int> <int>
# 1 30 40 20 60
# 2 20 50 40 30
# 3 40 20 50 30
# $p
# # A tibble: 3 x 4
# p1 p2 p3 p4
# <int> <int> <int> <int>
# 1 1 3 2 5
# 2 3 4 1 5
# 3 2 3 1 4
df <- structure(list(d1 = c(30L, 20L, 40L), d2 = c(40L, 50L, 20L),
d3 = c(20L, 40L, 50L), d4 = c(60L, 30L, 30L), p1 = c(1L,
3L, 2L), p2 = c(3L, 4L, 3L), p3 = c(2L, 1L, 1L), p4 = c(5L,
5L, 4L)), class = "data.frame", row.names = c(NA, -3L))
答案 4 :(得分:0)
使用索引,应该这样做:
d = df[,c(1:4)]
p = df[,c(5:8)]
使用名称扩展相同的概念:
dindices = grep("^d", colnames(df))
pindices = grep("^p", colnames(df))
d = df[,dindices]
p = df[,pindices]
答案 5 :(得分:0)
您可以使用库 dplyr 中的选择从源数据帧创建两个数据帧:
d<-select(dfsource, d1, d2, d3, d4)
p<-select(dfsource, p1, p2, p3, p4)
我希望这有帮助!!对我来说没关系!