R 在对数据表进行子集时使用case\u

R 在对数据表进行子集时使用case\u,r,datatable,R,Datatable,我对R还是新手,我遇到了一个问题。 我有一个包含原始数据的文件: dfRawData <- data.table( "Model" = c( "Car1", "Car1", "Car1", "Car2", "Car2", "Car2", "Car3", "Car3", "Car3" ), "variable" = c( "Metric1",

我对R还是新手,我遇到了一个问题。 我有一个包含原始数据的文件:

dfRawData <-
  data.table(
    "Model" = c(
      "Car1",
      "Car1",
      "Car1",
      "Car2",
      "Car2",
      "Car2",
      "Car3",
      "Car3",
      "Car3"
    ),
    "variable" = c(
      "Metric1",
      "Metric2",
      "Metric3",
      "Metric1",
      "Metric2",
      "Metric3",
      "Metric1",
      "Metric2",
      "Metric3"
    ),
    "valeur" = c(1, 2, 3, 4, 5, 6, 7, 8, 9)
  )
有人知道我做错了什么吗? 这是我的密码:

carName = 'Car1' ##Can be changed
dfCarMetric = case_when(
           carName == 'Car1' ~ dfRawData[which(dfRawData[["Model"]] == carName  &
                                               dfRawData[["variable"]] %in% c("Metric1", "Metric2")), ],
           carName == 'Car2' ~ dfRawData[which(dfRawData[["Model"]] %in% c("Car2", "Car3")  &
                                               dfRawData[["variable"]] == "Metric1"), ]
       )
最后我想说:

carName = 'Car1'
    dfCarMetric
       Model variable valeur
    1:  Car1  Metric1      1
    2:  Car1  Metric2      2

carName = 'Car2'
    dfCarMetric
      Model variable valeur
    4  Car2  Metric1      4
    7  Car3  Metric1      7

非常感谢您的回答

与其使用
case\u当
时(我想象它来自于包
dplyr
),不如尝试使用
filter
函数,它更适合于子设置数据集

库(dplyr)
图书馆(magrittr)

dfRawData如果要尽量减少条件语句的数量,可以在
filter
函数中使用它们,也可以从
dplyr
包中使用它们:

dfCarMetric <- dfRawData %>% 
  filter(
    if (carName == "Car1") 
      Model == carName & variable %in% c("Metric1", "Metric2") 
    else if (carName == "Car2") 
      Model %in% c("Car2", "Car3") & variable == "Metric1")
  )

如果您包含一个简单的示例输入和所需的输出,可以用来测试和验证可能的解决方案,那么就更容易为您提供帮助。不要发布数据的图片。我们无法复制/粘贴用于测试的数据。请以纯文本形式包含您数据的代表性样本-。其他用户无法复制/粘贴图像中的数据。但是如果我使用
过滤器
功能,我的输出不依赖于
carName
…请参阅编辑,其中包括如何将
carName
指定为函数的输入,以确定所需的输出。
dfCarMetric <- dfRawData %>% 
  filter(
    if (carName == "Car1") 
      Model == carName & variable %in% c("Metric1", "Metric2") 
    else if (carName == "Car2") 
      Model %in% c("Car2", "Car3") & variable == "Metric1")
  )
dfCarMetric <- dfRawData %>% 
  filter(case_when(
      carName == "Car1" ~
        Model == carName & variable %in% c("Metric1", "Metric2"), 
      carName == "Car2" ~
        Model %in% c("Car2", "Car3") & variable == "Metric1"
    )
  )