将6列数据转换为R中的2列

时间:2018-05-15 01:44:00

标签: r

在这些数据中,每个人在第4-6列中给出了3个项目中的每个项目。

> Sample.Score
  V1 V2 V3 V4 V5 V6
1  A  B  C 45 78 39
2  E  F  G 12 42 93
3  E  H  B 23 85 35
4  H  C  F 23 12 64

如何将其转换为2列,其中包含所有可能项目的分数,例如

> Sample.Score2
  V1 V2
1  A 45
2  B 78
3  C 39
4  E 12

有重复的项目,但我不想先把它们总结一下。

3 个答案:

答案 0 :(得分:1)

我们可以对数据集进行子集化,转置它,然后使用vector转换为c以创建新数据集的列

data.frame(V1 = c(t(df[1:3])), V2 = c(t(df[4:6])))
#    V1 V2
#1   A 45
#2   B 78
#3   C 39
#4   E 12
#5   F 42
#6   G 93
#7   E 23
#8   H 85
#9   B 35
#10  H 23
#11  C 12
#12  F 64

答案 1 :(得分:0)

在下文中,我只是使用if mode == tf.estimator.ModeKeys.EVAL: return tf.estimator.EstimatorSpec(mode=mode, loss=loss, eval_metric_ops={"accuracy": tf.metrics.mean(my_tensor)}) 两次。尽管字母按列顺序排列(与示例输出不同),但字母在同一行中具有正确的值。

lapply

使用的数据

data.frame(V1 = unlist(lapply(df[, 1:3], cbind)),
           V2 = unlist(lapply(df[, 4:6], cbind)))

#      V1 V2
# V11  A 45
# V12  E 12
# V13  E 23
# V14  H 23
# V21  B 78
# V22  F 42
# V23  H 85
# V24  C 12
# V31  C 39
# V32  G 93
# V33  B 35
# V34  F 64

答案 2 :(得分:0)

以下是几个选项,所有选项都有不同的从宽数据到长数据的方式。每次,您需要执行两次操作,因为您将分数转换为长数据,并将字母转换为长数据。除此之外,您还需要如何编写代码。

首先使用dplyrtidyr,您可以在其中使用gather并在单个语句中管理数据。 select允许您将名称更改为V1和V2。

library(tidyverse)

df_long_gather <- df %>%
  gather(key = key1, value = letter, V1:V3) %>%
  gather(key = key2, value = score, V4:V6) %>%
  select(V1 = letter, V2 = score) %>%
  arrange(V1)
head(df_long_gather)
#> # A tibble: 6 x 2
#>   V1       V2
#>   <chr> <int>
#> 1 A        45
#> 2 A        78
#> 3 A        39
#> 4 B        45
#> 5 B        23
#> 6 B        78

您还可以使用melt中的reshape2。您可以通过两个步骤(第一个版本)执行此操作,或者将一个调用嵌套在另一个内部以执行一个步骤(第二个版本)。您还可以使用%>%管道在单个语句中同时使用melt

两个步骤:

library(reshape2)
melted1 <- melt(df, id.vars = c("V1", "V2", "V3"), 
    measure.vars = c("V4", "V5", "V6"), variable.name = "key1", 
    value.name = "score")
melted2 <- melt(melted1, measure.vars = c("V1", "V2", "V3"), 
    variable.name = "key2", value.name = "V1")
df_long_melt <- data.frame(V1 = melted2$V1, V2 = melted2$score)
head(df_long_melt)
#>   V1 V2
#> 1  A 45
#> 2  E 12
#> 3  E 23
#> 4  H 23
#> 5  A 78
#> 6  E 42

一步:

df_long_melt2 <- melt(
    melt(df, measure.vars = c("V1", "V2", "V3"), value.name = "key1"),
    measure.vars = c("V4", "V5", "V6"), value.name = "key2")[, c(2, 4)]
names(df_long_melt2) <- c("V1", "V2")
head(df_long_melt2)
#>   V1 V2
#> 1  A 45
#> 2  E 12
#> 3  E 23
#> 4  H 23
#> 5  B 45
#> 6  F 12