我的数据如下:
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
答案 0 :(得分:3)
听起来您希望按网站拆分,然后按dd
列进行合并。您可以使用split
和merge
:
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