Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
R 合并多个连接的列_R_Dataframe_Merge_Multiple Columns - Fatal编程技术网

R 合并多个连接的列

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

我有两个不同的列用于几个示例,它们是连接的。我想将类型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 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模式is
cols=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