【问题标题】:R mutate variable to variable values from another observation, using a loop, an ifelse condition and subset (dplyr)R 使用循环、ifelse 条件和子集(dplyr)将变量从另一个观察值变异为变量值
【发布时间】:2020-08-28 03:28:02
【问题描述】:

在下面查看我的可重现和所需的输出。

我想创建一个新变量,在其中组合来自其他观察(行)的变量值,我想使用子集在循环中识别这些值。子集的条件由循环定义。 在示例 1 中,subset(df, country == i) 不起作用,但手动进行(在 Ex.2 中) subset(df, country == 'US') 有效。我认为country == icountry == 'US' 应该差不多。

# create a df
country <- c('US', 'US', 'China', 'China')
Trump_virus <- c('Y', 'N' ,'Y', 'N')
cases <- c (1000, 2000, 4, 6)
df <- data.frame(country, Trump_virus, cases)
#################################################### Ex.1
for (i in df$country) {
 print(i)
 df <- df %>%
  mutate(cases_corected = ifelse(
   Trump_virus == 'Y'
   ,subset(df, Trump_virus == 'N' & country ==  i)$cases*1000
   ,'killer_virus'
  ))}
##
df$cases_corected
#################################################### Ex.2
    for (i in df$country) {
 print(i)
 df <- df %>%
  mutate(cases_corected = ifelse(
   Trump_virus == 'Y'
   ,subset(df, Trump_virus == 'N' & country ==  'US')$cases*1000
   ,'killer_virus'
  ))}
##
df$cases_corected
################################################### Desired output
> df$cases_corected
[1] "2e+06"       
[2] "killer_virus"
[3] "6000"        
[4] "killer_virus"

【问题讨论】:

    标签: r for-loop subset dplyr


    【解决方案1】:

    这是dplyr 的解决方案。 根据所需输出的变化进行更新

    df <- df %>%
      mutate(country=toupper(country)) # to get same names for other variants of a country  #e.g. China and china
    
    #genearting a dataset which have cases only for Trump_virus==N
    df1<-df %>% 
      dplyr::filter(Trump_virus=="N") %>% 
      dplyr::mutate(ID= "Y",
                    cases_corected=cases*1e3) %>%
      dplyr::select(-c(cases,Trump_virus))
    
    # final merging
    df<-df %>% 
      left_join(df1,by=c("country"="country","Trump_virus"="ID")) %>%
      mutate(cases_corected=ifelse(is.na(cases_corected),'killer_virus',cases_corected))
    
    df
    
      country Trump_virus cases cases_corected
    1      US           Y  1000          2e+06
    2      US           N  2000   killer_virus
    3   CHINA           Y     4           6000
    4   CHINA           N     6   killer_virus
    

    【讨论】:

    • 抱歉,我之前的示例中有错字(现已更正)。我不想从同一行乘以不同行的值,我尝试通过子集和当前迭代来定义。
    • 相应地更新了我的答案
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2017-10-30
    • 1970-01-01
    • 2016-10-21
    • 1970-01-01
    • 2019-01-05
    • 1970-01-01
    相关资源
    最近更新 更多