首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将成对值分离为单个变量的行/列

将成对值分离为单个变量的行/列
EN

Stack Overflow用户
提问于 2018-06-02 07:22:33
回答 3查看 68关注 0票数 3

搜索过,但还没有看到这是在哪里处理的,我有一个项目站点之间绝对差异的成对计算数据框架,数据如下所示

代码语言:javascript
复制
   x y value
1  2 1     5
2  3 1     4
3  4 1     6
4  5 1     3
5  3 2     5
6  4 2     7
7  5 2     3
8  4 3     2
9  5 3     5
10 5 4     7

其中x和y是配对点,值是差异。我想得到平均的结果,每个网站的分别显示。例如:所有站点5对的站点平均值(5,5,5,5,5,1,5)= 4.5,因此我的结果如下:

代码语言:javascript
复制
site    avg 
   1    4.5
   2    5
   3    4
   4    5.5
   5    4.5

谁有解决办法?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2018-06-02 11:43:19

使用dplyrmapply的解决方案。

代码语言:javascript
复制
library(dplyr)

data.frame(site = unique(c(df$x, df$y))) %>%
  mutate(mean =  mapply(function(v)mean(df$value[df$x==v | df$y==v]), .$site)) %>%
  arrange(site)

#   site mean
# 1    1  4.5
# 2    2  5.0
# 3    3  4.0
# 4    4  5.5
# 5    5  4.5

数据:

代码语言:javascript
复制
df <- read.table(text = 
"  x y value
1  2 1     5
2  3 1     4
3  4 1     6
4  5 1     3
5  3 2     5
6  4 2     7
7  5 2     3
8  4 3     2
9  5 3     5
10 5 4     7",
header = TRUE, stringsAsFactors = FALSE)
票数 1
EN

Stack Overflow用户

发布于 2018-06-02 15:00:58

下面是使用tidyverse的另一个选项

代码语言:javascript
复制
library(tidyverse)
df %>% 
   select(x, y) %>% 
   unlist %>% 
   unique %>% 
   sort %>% 
   tibble(site = .) %>% 
   mutate(avg = map_dbl(site, ~
             df %>% 
               filter_at(vars(x, y), any_vars(. == .x)) %>% 
               summarise(value = mean(value)) %>%
               pull(value)))
# A tibble: 5 x 2
#   site  avg
#  <int> <dbl>
#1     1   4.5
#2     2   5  
#3     3   4  
#4     4   5.5
#5     5   4.5

数据

代码语言:javascript
复制
df <- structure(list(x = c(2L, 3L, 4L, 5L, 3L, 4L, 5L, 4L, 5L, 5L), 
    y = c(1L, 1L, 1L, 1L, 2L, 2L, 2L, 3L, 3L, 4L), value = c(5L, 
    4L, 6L, 3L, 5L, 7L, 3L, 2L, 5L, 7L)), .Names = c("x", "y", 
"value"), class = "data.frame",
   row.names = c("1", "2", "3", 
"4", "5", "6", "7", "8", "9", "10"))
票数 2
EN

Stack Overflow用户

发布于 2018-06-02 07:50:09

如果我们将原始数据示例命名为df

代码语言:javascript
复制
df$site_pair <- paste(df$x, df$y, sep = "-")
all_sites <- unique(c(df$x, df$y))
site_get_mean <- function(site_name) {
  yes <- grepl(site_name, df$site_pair)
  mean(df$value[yes])
}

df.new <- data.frame(site = all_sites, 
                     avg = sapply(all_sites, site_get_mean))

结果:(编辑后按网站名称排序)

代码语言:javascript
复制
> df.new[order(df.new$site), ]
  site avg
5    1 4.5
1    2 5.0
2    3 4.0
3    4 5.5
4    5 4.5
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50654522

复制
相关文章

相似问题

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