Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/security/4.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
使用gather()将两个(或更多)列组收集为两个(或更多)键值对_R_Reshape_Tidyr_Keyvaluepair - Fatal编程技术网

使用gather()将两个(或更多)列组收集为两个(或更多)键值对

使用gather()将两个(或更多)列组收集为两个(或更多)键值对,r,reshape,tidyr,keyvaluepair,R,Reshape,Tidyr,Keyvaluepair,我想将两组独立的列收集到两个键值对中。以下是一些示例数据: library(dplyr) library(tidyr) ID = c(1:5) measure1 = c(1:5) measure2 = c(6:10) letter1 = c("a", "b", "c", "d", "e") letter2 = c("f", "g", "h", "i", "j") df = data.frame(ID, measure1, measure2, letter1, letter2) df = tbl

我想将两组独立的列收集到两个键值对中。以下是一些示例数据:

library(dplyr)
library(tidyr)
ID = c(1:5)
measure1 = c(1:5)
measure2 = c(6:10)
letter1 = c("a", "b", "c", "d", "e")
letter2 = c("f", "g", "h", "i", "j")

df = data.frame(ID, measure1, measure2, letter1, letter2)
df = tbl_df(df)
df$letter1 <- as.character(df$letter1)
df$letter2 <- as.character(df$letter2)

因此,这是完美的(在这种情况下),但我想这可以做得更优雅(没有像拆分或创建'id.extra'这样的东西)。所以请解释一下

您可以使用如下内容。从您当前的方法来看,我不确定这是否正是您想要的输出,因为它似乎包含大量冗余信息

df %>%
  gather(val, var, -ID) %>%
  extract(val, c("value", "time"), regex = "([a-z]+)([0-9]+)") %>%
  spread(value, var)
# # A tibble: 10 × 4
#       ID  time letter measure
# *  <int> <chr>  <chr>   <chr>
# 1      1     1      a       1
# 2      1     2      f       6
# 3      2     1      b       2
# 4      2     2      g       7
# 5      3     1      c       3
# 6      3     2      h       8
# 7      4     1      d       4
# 8      4     2      i       9
# 9      5     1      e       5
# 10     5     2      j      10

或者,您可以是老派,只需从基本R使用
重塑
。但是,请注意,基本R的
重塑
不喜欢“tibbles”,因此您必须将其转换为
as.data.frame


我们可以使用来自
数据的
melt
。表
,它可以采取多个
测量
模式

library(data.table)
melt(setDT(df), measure = patterns("^measure", "^letter"), 
          value.name = c("measure", "letter"))
#     ID variable measure letter
# 1:  1        1       1      a
# 2:  2        1       2      b
# 3:  3        1       3      c
# 4:  4        1       4      d
# 5:  5        1       5      e
# 6:  1        2       6      f
# 7:  2        2       7      g
# 8:  3        2       8      h
# 9:  4        2       9      i
#10:  5        2      10      j

这看起来不错,但是如果我想在代码中显式使用columnn或变量名,我该怎么办?我还想得到两个键值对?@BenjaminTelkamp,只需复制“variable”列。。。。为什么你想要重复的数据呢?在这种情况下,我有两个测量值和字母值的观察值,但如果我有三个观察值,一组怎么办?@Benjaminelkamp,我还没有测试过这些情况。也许,它将由NA@BenjaminTelkamp,则“variable”列的值为1:3,对于“3”的值将显示
NA
。gather()函数无法执行此操作?@BenjaminTelkamp,无法执行什么操作?我在第一种方法中使用了
聚集
函数。但是,您必须收集所有列,然后将它们展开。
library(data.table)
melt(as.data.table(df), measure.vars = patterns("measure", "letter"))
reshape(as.data.frame(df), direction = "long", idvar = "ID", 
        varying = 2:ncol(df), sep = "")
library(data.table)
melt(setDT(df), measure = patterns("^measure", "^letter"), 
          value.name = c("measure", "letter"))
#     ID variable measure letter
# 1:  1        1       1      a
# 2:  2        1       2      b
# 3:  3        1       3      c
# 4:  4        1       4      d
# 5:  5        1       5      e
# 6:  1        2       6      f
# 7:  2        2       7      g
# 8:  3        2       8      h
# 9:  4        2       9      i
#10:  5        2      10      j