如何按特定类别拆分列?

时间:2015-10-27 17:38:30

标签: r

我的数据如下:

  dd gg site
  5  10 A
  7  8  A
  5  6  B 
  7  9  B 

我想根据site拆分A and B列。所需的输出是:

    dd gg site  gg_B
    5  10 A     6
    7  8  A     9

5 个答案:

答案 0 :(得分:3)

听起来您希望按网站拆分,然后按dd列进行合并。您可以使用splitmerge

执行此操作
Reduce(function(x, y) merge(x, y, by="dd"), split(dat, dat$site))
#   dd gg.x site.x gg.y site.y
# 1  5   10      A    6      B
# 2  7    8      A    9      B

使用Reduce,即使您有两个以上的网站,此代码也可以正常运行。我已经执行了内部联接,这意味着如果为所有站点报告,我将只为给定值dd保留一行。如果您希望为一个或多个网站使用dd的给定值保留一行,则可以使用:

Reduce(function(x, y) merge(x, y, by="dd", all=TRUE), split(dat, dat$site))

答案 1 :(得分:3)

也许你会对

感到满意
library("reshape2")
dcast(dat,dd~site,value.var="gg")
##   dd  A B
## 1  5 10 6
## 2  7  8 9

? (这与其他人建议的tidyr::spread()答案基本相同。)

答案 2 :(得分:3)

如果列始终处于正确的顺序,您只需将它们绑定:

l <- split(dat, dat$site)
l$B <- l$B$gg
cbind(l$A, l$B, deparse.level = 0)

结果:

  dd gg site l$B
1  5 10    A   6
2  7  8    A   9

数据:

dat <- read.table(header = TRUE, stringsAsFactors = FALSE, text = "  dd gg site
  5  10 A
                  7  8  A
                  5  6  B 
                  7  9  B ")

答案 3 :(得分:2)

您的请求似乎很奇怪,网站的值与B值的处理方式不同。

使用此数据:

xx = structure(list(dd = c(5L, 7L, 5L, 7L), gg = c(10L, 8L, 6L, 9L
), site = structure(c(1L, 1L, 2L, 2L), .Label = c("A", "B"), class = "factor")), .Names = c("dd", 
"gg", "site"), class = "data.frame", row.names = c(NA, -4L))

我们可以使用tidyr::spread将列从长格式“扩展”到宽格式。但这会消除站点列并将其A和B值视为相同:

library(tidyr)
(xx = spread(xx, key = site, value = gg))
#   dd  A B
# 1  5 10 6
# 2  7  8 9

在名称中添加gg_前缀:

names(xx)[2:3] = paste("gg", names(xx[2:3]), sep = "_")
xx
#   dd gg_A gg_B
# 1  5   10    6
# 2  7    8    9

我更喜欢上述格式的数据。如果您想要与所需的输出完全匹配,则添加xx$site = "A"并重命名现有列非常容易。

答案 4 :(得分:1)

您可以使用tidyr以宽格式转换包含所需网站的数据子集,然后使用dplyr::inner_join将其与包含其他网站的数据子集合并

library(dplyr)
library(tidyr)
df %>%
  filter(site == "B") %>%
  spread(key = site, value = gg) %>%
  inner_join(filter(df, site != "B"))
## Joining by: "dd"
##   dd B gg site
## 1  5 6 10    A
## 2  7 9  8    A