R 合并多个连接的列
我有两个不同的列用于几个示例,它们是连接的。我想将类型1的所有列合并为一列,将类型2的所有列合并为一列,但行应该保持连接 例如:R 合并多个连接的列,r,dataframe,merge,multiple-columns,R,Dataframe,Merge,Multiple Columns,我有两个不同的列用于几个示例,它们是连接的。我想将类型1的所有列合并为一列,将类型2的所有列合并为一列,但行应该保持连接 例如: a1 <- c(1, 2, 3, 4, 5) b1 <- c(1, 4, 9, 16, 25) a2 <- c(2, 4, 6, 8, 10) b2 <- c(4, 8, 12, 16, 20) df1 <- data.frame(a1, b1, a2, b2) a1 b1 a2 b2 1 1 1 2 4 2
a1 <- c(1, 2, 3, 4, 5)
b1 <- c(1, 4, 9, 16, 25)
a2 <- c(2, 4, 6, 8, 10)
b2 <- c(4, 8, 12, 16, 20)
df1 <- data.frame(a1, b1, a2, b2)
a1 b1 a2 b2
1 1 1 2 4
2 2 4 4 8
3 3 9 6 12
4 4 16 8 16
5 5 25 10 20
这就是我的例子。我有很多不同名称的列,我想提取abs\u dist\u 1。。。abs地区5和平均等级1。。。新数据框中的平均值5
,所有绝对值在一列中,所有平均值在一列中,但仍保持连接
我尝试了取消列表
,但是连接当然会丢失
提前感谢。通过将
名称指定为regex查找,以匹配小写字母([a-z]
)和列名中的数字,从tidyr
中选择pivot\u longer
library(dplyr)
library(tidyr)
df1 %>%
pivot_longer(cols = everything(), names_to = c( '.value', 'grp'),
names_sep = "(?<=[a-z])(?=[0-9])") %>%
select(-grp)
或者使用base R
,在列名的子字符串上使用split.default
,将其放入data.frame的列表
,然后通过循环列表
将每个列表
元素转换为data.frame
data.frame(lapply(split.default(df1, sub("\\d+", "", names(df1))),
unlist, use.names = FALSE))
通过将names\u sep
指定为正则表达式查找,以匹配小写字母([a-z]
)和列名中的数字,从tidyr
中选择pivot\u longer
library(dplyr)
library(tidyr)
df1 %>%
pivot_longer(cols = everything(), names_to = c( '.value', 'grp'),
names_sep = "(?<=[a-z])(?=[0-9])") %>%
select(-grp)
或者使用base R
,在列名的子字符串上使用split.default
,将其放入data.frame的列表
,然后通过循环列表
将每个列表
元素转换为data.frame
data.frame(lapply(split.default(df1, sub("\\d+", "", names(df1))),
unlist, use.names = FALSE))
使用重塑
subset(
reshape(
setNames(df1, gsub("(\\d)", ".\\1", names(df1))),
direction = "long",
varying = 1:ncol(df1)
),
select = -c(time, id)
)
给予
使用重塑
subset(
reshape(
setNames(df1, gsub("(\\d)", ".\\1", names(df1))),
direction = "long",
varying = 1:ncol(df1)
),
select = -c(time, id)
)
给予
为了完整起见,这里有一个解决方案,它使用data.table::melt()
和patterns()
函数指定属于一起的列:
library(data.table)
melt(setDT(df1), measure.vars = patterns(a = "a", b = "b"))[
order(a,b), !"variable"]
这将重现OP的样本数据集的预期结果
一个更现实的示例:仅重塑选定的柱
通过对问题的编辑,OP澄清了生产数据包含的列比需要重塑的列多得多:
我有很多不同名称的列,我想提取
abs\u dist\u 1
<代码>abs距离5和平均水平1
<代码>平均水平5
在新的
数据框,所有abs\u dist
在一列中,所有mean\u vel
在一列中
列,但仍然连接
因此,OP希望一次性提取和重塑感兴趣的列,同时忽略数据集中的所有其他数据
为了模拟这种情况,我们需要一个更复杂的数据集,其中还包括其他列:
df2 <- cbind(df1, c1 = 11:15, c2 = 21:25)
df2
使用上面代码的修改版本
library(data.table)
cols <- c("a", "b")
result <- melt(setDT(df2), measure.vars = patterns(cols), value.name = cols)[, ..cols]
setorderv(result, cols)
result
对于编辑中所示的生产数据集,OP需要设置
cols <- c("abs_dist", "mean_vel")
cols为了完整起见,这里有一个解决方案,它使用data.table::melt()
和patterns()
函数指定属于一起的列:
library(data.table)
melt(setDT(df1), measure.vars = patterns(a = "a", b = "b"))[
order(a,b), !"variable"]
这将重现OP的样本数据集的预期结果
一个更现实的示例:仅重塑选定的柱
通过对问题的编辑,OP澄清了生产数据包含的列比需要重塑的列多得多:
我有很多不同名称的列,我想提取
abs\u dist\u 1
<代码>abs距离5和平均水平1
<代码>平均水平5
在新的
数据框,所有abs\u dist
在一列中,所有mean\u vel
在一列中
列,但仍然连接
因此,OP希望一次性提取和重塑感兴趣的列,同时忽略数据集中的所有其他数据
为了模拟这种情况,我们需要一个更复杂的数据集,其中还包括其他列:
df2 <- cbind(df1, c1 = 11:15, c2 = 21:25)
df2
使用上面代码的修改版本
library(data.table)
cols <- c("a", "b")
result <- melt(setDT(df2), measure.vars = patterns(cols), value.name = cols)[, ..cols]
setorderv(result, cols)
result
对于编辑中所示的生产数据集,OP需要设置
cols <- c("abs_dist", "mean_vel")
cols好的,在我的特定情况下,我的数据框中有更多的列,而不是a1、a2、
和b1、b2、
,而是dist1、dist2、
和vel1、vel2、
。我必须以什么方式更改命令?@MDC如果模式相似,则不必更改任何内容,例如dist1、dist2、vel1、vel2等,它们的工作方式应与“a1”、“a2”、“b1”、“b2”等相同。请注意,我使用了everything()
ie。所有列都具有类似的模式。如果它是一个子集,那么您可能需要在cols=
'@MDC中指定,如果解决方案有效,请选择是,我忘了提到,它是数据帧中的一个子集。在这种情况下,如何指定cols=
?@MDC您可以指定索引,即假设列dist1到vel10的位置从3到10,然后使用cols=3:10
,否则,您也可以使用regex模式iscols=matches(“^[A-Za-z]+\\d+$”)
即以小写或大写字母开始,然后在列名称的末尾加上一个或多个数字好的,在我的特定情况下,我的数据框中有更多的列,而不是a1、a2、
和b1、b2、
,而是dist1、dist2、
和vel1、vel2,…
。我必须以什么方式更改命令?@MDC如果模式相似,则不必更改任何内容,例如dist1、dist2、vel1、vel2等,它们的工作方式应与“a1”、“a2”、“b1”、“b2”等相同。请注意,我使用了everything()
ie。所有列都具有类似的模式。如果它是一个子集,那么您可能需要在cols=
'@MDC中指定,如果解决方案有效,请选择是,我忘了提到,它是数据帧中的一个子集。在这种情况下,如何指定cols=
?@MDC您可以指定任何一个索引,即假设列为dis