仅当满足多个条件时,才将不同列中的值匹配到行

J·亚历克斯·贝克尔

场景是飙车...有时车手与竞争对手比赛,有时他们只是独自比赛。驾驶员及其技能水平始终是完全随机的。比赛在第12圈结束后,每天进行一次比赛,持续10年。有数百个驱动程序。独立观察员在比赛期间记录了数据,包括驾驶员的速度,但仅记录其中一名驾驶员!因此,数据丢失。这是数据的前6行:

    df <- data.frame(
      Driver_name =  c("Rick",  "Julie",  "Denver", "Johny",  "Cassandra", "Phillip"),
      Driver_level = c("A",     "C",      "D",      "A",      "B",         "B"),
      Driver_speed = c(96,       91,       89,       94,       88,          99),
      Competitor=    c("Yes",   "Yes",    "Yes",    "Yes",    "No",        "No"),
      Comp_name=     c("Julie", "Rick",   "Johnny", "Denver", "NA",        "NA"),
      Comp_level=    c("B",     "B",      "D",      "A",      "NA",        "NA"),
      Comp_speed=    c("???",   "???",    "???",    "???",    "NA",        "NA"),
      Race_day=      c(165,      165,      72,       72,       92,          65),
      Lap_number=    c(9,        9,        12,       12,       8,           4),
      Humidity=      c(33,       33,       88,       88,       12,          55),
      Temperature=   c(28,       28,       12,       12,       20,          28)
    )

每行代表不同的驱动程序,但我需要填写数据以了解竞争对手的速度!我将手动输入速度,以演示其余数据集需要执行的操作。

    df_1 <- data.frame(
      Driver_name =  c("Rick",  "Julie",  "Denver", "Johny",  "Cassandra", "Phillip"),
      Driver_level = c("A",     "C",      "D",      "A",      "B",         "B"),
      Driver_speed = c(96,       91,       89,       94,       88,          99),
      Competitor=    c("Yes",   "Yes",    "Yes",    "Yes",    "No",        "No"),
      Comp_name=     c("Julie", "Rick",   "Johnny", "Denver", "NA",        "NA"),
      Comp_level=    c("B",     "B",      "D",      "A",      "NA",        "NA"),
      Comp_speed=    c(91,       96,       94,       89,      "NA",        "NA"),
      Race_day=      c(165,      165,      72,       72,       92,          65),
      Lap_number=    c(9,        9,        12,       12,       8,           4),
      Humidity=      c(33,       33,       88,       88,       12,          55),
      Temperature=   c(28,       28,       12,       12,       20,          28)
    )

这是aleft_join的理想选择。

您的资料

df <- data.frame(
  Driver_name =  c("Rick",  "Julie",  "Denver", "Johny",  "Cassandra", "Phillip"),
  Driver_level = c("A",     "C",      "D",      "A",      "B",         "B"),
  Driver_speed = c(96,       91,       89,       94,       88,          99),
  Competitor=    c("Yes",   "Yes",    "Yes",    "Yes",    "No",        "No"),
  Comp_name=     c("Julie", "Rick",   "Johnny", "Denver", "NA",        "NA"),
  Comp_level=    c("B",     "B",      "D",      "A",      "NA",        "NA"),
  Comp_speed=    c("???",   "???",    "???",    "???",    "NA",        "NA"),
  Race_day=      c(165,      165,      72,       72,       92,          65),
  Lap_number=    c(9,        9,        12,       12,       8,           4),
  Humidity=      c(33,       33,       88,       88,       12,          55),
  Temperature=   c(28,       28,       12,       12,       20,          28)
)

我们加载dplyr包裹

#install.packages("dplyr") #if you don't have it
library(dplyr)

让我们摆脱Comp_speed当前具有“ ???”价值观。

df <- df %>% select(-Comp_speed)

让我们创建一个仅包含名称和速度的数据框,然后即时将Driver_speed重命名为Comp_speed。

df2 <- df %>% 
  select(Driver_name, Comp_speed = Driver_speed)

现在我们可以left_joindf数据框更改为df2Comp_nameindfDriver_namein匹配df2

df_updated <- df %>% 
  left_join(df2, by = c("Comp_name" = "Driver_name"))
#> Warning: Column `Comp_name`/`Driver_name` joining factors with different
#> levels, coercing to character vector

这是结果数据框 df_updated

df_updated
#>   Driver_name Driver_level Driver_speed Competitor Comp_name Comp_level
#> 1        Rick            A           96        Yes     Julie          B
#> 2       Julie            C           91        Yes      Rick          B
#> 3      Denver            D           89        Yes    Johnny          D
#> 4       Johny            A           94        Yes    Denver          A
#> 5   Cassandra            B           88         No        NA         NA
#> 6     Phillip            B           99         No        NA         NA
#>   Race_day Lap_number Humidity Temperature Comp_speed
#> 1      165          9       33          28         91
#> 2      165          9       33          28         96
#> 3       72         12       88          12         NA
#> 4       72         12       88          12         89
#> 5       92          8       12          20         NA
#> 6       65          4       55          28         NA 

更新:

随着OP的提出,这对于不止一次赛车的赛车手来说并不牢固(我的疏忽)。

假设(从数据中)Race_dayLap_number变量足以区分每个正面竞争,我们只需将它们保留在df2数据框中即可。然后在我们的列表中加入这些列名称left_join这就是它的样子。

df2 <- df %>% 
  select(Driver_name, Comp_speed = Driver_speed, Race_day, Lap_number)

df_updated <- df %>% 
  left_join(df2, by = c("Comp_name" = "Driver_name", "Race_day", "Lap_number"))
#> Warning: Column `Comp_name`/`Driver_name` joining factors with different
#> levels, coercing to character vector

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

仅当匹配多个条件时,才计算部分列中的唯一值

仅当具有多个不同的值时,才如何基于其他列删除行

仅当 R 中的列值匹配时才计算 difftime

仅当另一列的值满足条件时才获取列的分位数

仅当所有其他行都满足条件时才更新行值

仅当它们在 Javascript 中连续时才检查数组的值是否满足条件

仅当满足另一列的条件时才填写

Excel-仅当当前行的多个条件匹配时才返回一行中的单元格

仅当满足条件时才返回n个匹配结果,从最高值到最低值

仅当条件满足时才检查条件

创建一个新变量,仅当 R 中满足条件时才打印一系列列中的第一个值

仅当满足条件时才自动移至列中的下一个单元格;如果不满足条件,请检查下一行中的条件并继续执行相同的操作

满足条件时,使列行与另一列的匹配值具有相同的值

当必须满足不同列中的不同条件时,如何获得 INDEX 公式以返回特定值?

仅当不存在具有满足条件的值的行时才为列选择值

SQL:仅当在同一行中另一列具有不同的值时,才返回一列的值

仅当满足所有相同值实例的条件时,才如何按结果分组

仅当列中存在特定条件值时才进行分组

仅当存在多个组时才匹配

仅当匹配 Eloquent 中的 ID 时才选择特定列

列范围X的值匹配到同一行但列范围不同的返回值

仅当条件满足使用模型中的数据时才显示 url 链接 - Django

SQL:仅当满足条件时,才使用同一表中的值更新字段

仅当列值等于某个值或在该值之间的行中(熊猫)时才保留列值

仅当满足另一列中的条件时,才能将2值列中的值更改为相反值

MySQL:筛选不同行中的多个值,但仅返回匹配两个值的行

仅当满足特定布尔条件时,才使Observable返回

仅当条件满足时才执行脚本

仅当条件连续满足 3 次时才打印语句