首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >将6列数据转换为R中的2列

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

Stack Overflow用户
提问于 2018-05-15 01:43:59
回答 3查看 64关注 0票数 1

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

代码语言:javascript
运行
复制
> 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列,例如:

代码语言:javascript
运行
复制
> Sample.Score2
  V1 V2
1  A 45
2  B 78
3  C 39
4  E 12

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

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-05-15 03:38:21

我们可以对数据集进行子集,转换数据集,然后使用c将其转换为c以创建新数据集的列。

代码语言:javascript
运行
复制
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
EN

Stack Overflow用户

发布于 2018-05-15 02:09:29

在下面,我只使用了两次lapply。虽然字母按列顺序排列(与示例输出不同),但这些字母在同一行中具有正确的值。

代码语言:javascript
运行
复制
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

所用数据

代码语言:javascript
运行
复制
df <- read.table(text="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", head =TRUE, stringsAsFactors = FALSE)
票数 0
EN

Stack Overflow用户

发布于 2018-05-15 14:55:27

这里有几个选项,它们都有从宽到长数据的不同方式。每次,您需要做两次操作,因为您正在将分数转换为长数据,并将字母转换为长数据。除此之外,您希望如何编写代码是首选的问题。

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

代码语言:javascript
运行
复制
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

两个步骤:

代码语言:javascript
运行
复制
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

一步:

代码语言:javascript
运行
复制
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
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50341174

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档