【问题标题】:Nested loop and if in R with combination replacement嵌套循环和 if 在 R 中的组合替换
【发布时间】:2021-08-08 02:55:39
【问题描述】:

我有以下数据框:

df1 <- data.frame(
  nutriment = c("glucose", "fructose", "lipid", "iron", "vitamin"),
  family = c("A", "B" , "B", "C", "D"),
  rank = c(1, 2 , 2, 3, 4),
  indicator = c(1, 1, 0, 1, 1)
)

我想做以下事情。

每次比较两个家族,只要一个家族的排名高于另一个,那么与这个家族相关的指标==1的营养物就变得独立了,即他的新家族=="独立"

例如,在下面的th中,比较家庭A和B,A具有更大的排名,因此指标==1的营养物对应于家庭A,现在有一个家庭==“独立”..并为所有家庭。

我一直在努力解决这个问题,并认为它可以诉诸嵌套 for 循环?我未能实施它,希望得到任何人的帮助。

【问题讨论】:

  • 预期输出是什么?
  • 嘿冰淇淋巨嘴鸟。有 4 个族,因此输出将是 3*4/2 数据帧。在每个数据帧中,唯一的变化是指标 ==1 的营养物对于排名更高的家庭(总是只比较 2 个家庭)现在具有家庭 ==独立(新家庭)

标签: r for-loop if-statement dplyr


【解决方案1】:
df1 <- data.frame(
  nutriment = c("glucose", "fructose", "lipid", "iron", "vitamin"),
  family = c("A", "B" , "B", "C", "D"),
  rank = c(1, 2 , 2, 3, 4),
  indicator = c(1, 1, 0, 1, 1)
)

library(dplyr)
#> 
#> Attaching package: 'dplyr'
#> The following objects are masked from 'package:stats':
#> 
#>     filter, lag
#> The following objects are masked from 'package:base':
#> 
#>     intersect, setdiff, setequal, union
library(data.table)
#> 
#> Attaching package: 'data.table'
#> The following objects are masked from 'package:dplyr':
#> 
#>     between, first, last

fams <- 
  df1 %>% 
    select(family, rank) %>% 
    distinct %>% 
    mutate(t = 1) %>% 
    left_join(., ., by = 't') %>% 
    filter(family.x != family.y, 
             rowid(paste(pmin(family.x, family.y), pmax(family.x, family.y))) == 1) %>% 
    mutate(gt = rank.y > rank.x) %>% 
    group_by(family.x, family.y) %>% 
    mutate(newdf = 
             df1 %>% 
              filter(family %in% c(family.x, family.y)) %>% 
              mutate(family = if_else(family == family.x & gt & indicator, 
                                      'independent', family)) %>% 
             list
    )
  
    
fams$newdf
#> [[1]]
#>   nutriment      family rank indicator
#> 1   glucose independent    1         1
#> 2  fructose           B    2         1
#> 3     lipid           B    2         0
#> 
#> [[2]]
#>   nutriment      family rank indicator
#> 1   glucose independent    1         1
#> 2      iron           C    3         1
#> 
#> [[3]]
#>   nutriment      family rank indicator
#> 1   glucose independent    1         1
#> 2   vitamin           D    4         1
#> 
#> [[4]]
#>   nutriment      family rank indicator
#> 1  fructose independent    2         1
#> 2     lipid           B    2         0
#> 3      iron           C    3         1
#> 
#> [[5]]
#>   nutriment      family rank indicator
#> 1  fructose independent    2         1
#> 2     lipid           B    2         0
#> 3   vitamin           D    4         1
#> 
#> [[6]]
#>   nutriment      family rank indicator
#> 1      iron independent    3         1
#> 2   vitamin           D    4         1

reprex package (v2.0.0) 于 2021-05-18 创建

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2020-03-06
    • 2021-08-09
    • 1970-01-01
    • 1970-01-01
    • 2017-11-29
    • 1970-01-01
    • 1970-01-01
    • 2019-01-24
    相关资源
    最近更新 更多