【问题标题】:Create a new variable in data frame depending on two other variables根据其他两个变量在数据框中创建一个新变量
【发布时间】:2018-11-23 19:09:16
【问题描述】:

我有一个大数据框,想创建一个依赖于其他两个变量的新变量。

这是一个简短的例子:

v1 <- rep(c(1:5),each=3)
v2 <- c('X','A','Y','X','Y','B','X','Y','C','X','Y','C','X','Y','A')

dat <- data.frame(v1,v2)

#create a new var which contains either A,B, or C depending on what is found in v2  


#desired output
v3 <- rep(c('A','B','C','C','A'),each=3)
data.frame(v1,v2,v3)

关于如何用短代码做到这一点的任何想法?

我试过这个,但离解决方案还很远。遗漏太多。 :(

dat$v3[dat$v2 %in% c('A','B','C')] <- dat$v2[dat$v2 %in% c('A','B','C')]

【问题讨论】:

  • with(dat, ave(v2, v1, FUN = function(i) tail(i, 1))) 这样的东西应该这样做,因为订单总是如图所示
  • 据我所知v3 仅取决于一个变量。规则似乎是 1 -> A、2 -> B 等等。
  • 比较复杂。我将添加另一行;)
  • 您能否也添加您失败的尝试?
  • dplyrcase_when()ifelse() 语句非常适合这里。但是,由于您没有提供确切的条件,因此很难编写示例。

标签: r


【解决方案1】:
library(tidyverse)
dat %>% group_by(v1) %>% mutate(v3 = intersect(v2, c("A", "B", "C")))
# A tibble: 15 x 3
# Groups:   v1 [5]
#       v1 v2    v3   
#    <int> <fct> <chr>
#  1     1 X     A    
#  2     1 A     A    
#  3     1 Y     A    
#  4     2 X     B    
#  5     2 Y     B    
#  6     2 B     B    
#  7     3 X     C    
#  8     3 Y     C    
#  9     3 C     C    
# 10     4 X     C    
# 11     4 Y     C    
# 12     4 C     C    
# 13     5 X     A    
# 14     5 Y     A    
# 15     5 A     A    

这是假设A、B、C中只有一个可以出现在v1给定的组中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-04-28
    • 2021-10-15
    • 2022-07-15
    • 1970-01-01
    • 2018-07-02
    • 2011-02-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多