Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/71.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
是否有任何R函数或脚本来交换以下选择集数据中的选择值?_R_Function_Scripting_Mutate_Case When - Fatal编程技术网

是否有任何R函数或脚本来交换以下选择集数据中的选择值?

是否有任何R函数或脚本来交换以下选择集数据中的选择值?,r,function,scripting,mutate,case-when,R,Function,Scripting,Mutate,Case When,数据集:模式=c(滑行,滑行,滑行,滑行),选项=c(1,0,0,0),主模式=c(基站,汽车,主动,德克萨斯州) 这里观察到的实际行程是从列名称“mode”开始的滑行。然后,我需要根据“mainmode”列信息将第1行的“chioce”列0和第4行的1中的值更改为,其中BS=公共汽车,car=汽车,active=步行,TX=出租车 假设您的数据位于数据框df中,您需要创建一个查找表,然后查找要从mainmode转换为mode的值。然后在模式上匹配 modelookup=data.frame(m

数据集:模式=c(滑行,滑行,滑行,滑行),选项=c(1,0,0,0),主模式=c(基站,汽车,主动,德克萨斯州)


这里观察到的实际行程是从列名称“mode”开始的滑行。然后,我需要根据“mainmode”列信息将第1行的“chioce”列0和第4行的1中的值更改为,其中BS=公共汽车,car=汽车,active=步行,TX=出租车

假设您的数据位于数据框
df
中,您需要创建一个查找表,然后查找要从mainmode转换为mode的值。然后在模式上匹配

modelookup=data.frame(mode=c("bus","car","walk","taxi"),main=c("BS","car","active","TX"))
df$lookup = modelookup$mode[match(df$mainmode, modelookup$main)]
df$choice = as.numeric(df$mode==df$lookup)

假设数据位于数据框
df
,则需要创建一个查找表,然后查找要从mainmode转换为mode的值。然后在模式上匹配

modelookup=data.frame(mode=c("bus","car","walk","taxi"),main=c("BS","car","active","TX"))
df$lookup = modelookup$mode[match(df$mainmode, modelookup$main)]
df$choice = as.numeric(df$mode==df$lookup)

mode
mainmode
没有相同的术语,因此无法对它们进行比较。更改
模式
main模式
,这样就很容易直接比较它们

library(dplyr)

df %>%
   mutate(mainmode = recode(mainmode, 'BS' = 'BUS', 'car' = 'car', 
                            'active' = 'walk', 'TX' = 'taxi'), 
          choice = as.integer(mode == mainmode))


#  mode choice mainmode
#1 taxi      0      BUS
#2 taxi      0      car
#3 taxi      0     walk
#4 taxi      1     taxi
数据

df <- data.frame(mode=c("taxi", "taxi", "taxi", "taxi"), choice = c(1, 0, 0, 0),
           mainmode = c("BS", "car", "active", "TX"), stringsAsFactors = FALSE)

df
mode
mainmode
没有相同的术语,因此无法对它们进行比较。更改
模式
main模式
,这样就很容易直接比较它们

library(dplyr)

df %>%
   mutate(mainmode = recode(mainmode, 'BS' = 'BUS', 'car' = 'car', 
                            'active' = 'walk', 'TX' = 'taxi'), 
          choice = as.integer(mode == mainmode))


#  mode choice mainmode
#1 taxi      0      BUS
#2 taxi      0      car
#3 taxi      0     walk
#4 taxi      1     taxi
数据

df <- data.frame(mode=c("taxi", "taxi", "taxi", "taxi"), choice = c(1, 0, 0, 0),
           mainmode = c("BS", "car", "active", "TX"), stringsAsFactors = FALSE)

df我们可以使用
data.table
方法

library(data.table)
setDT(df)[, mainmode := recode(mainmode, 'BS' = 'BUS', 
                  'car' = 'car', 
                           'active' = 'walk', 'TX' = 'taxi')][, choice := +(mode == mainmode)]
df
#   mode choice mainmode
#1: taxi      0      BUS
#2: taxi      0      car
#3: taxi      0     walk
#4: taxi      1     taxi

或者在
base R
中,这可以通过命名向量完成

df$mainmode <- setNames(c('BUS', 'car', 'walk', 'taxi'), 
           c('BS', 'car', 'active', 'TX'))[as.character(df$mainmode)]
df$choice <- +(df$mode == df$mainmode)

df$mainmode我们可以使用
data.table
方法

library(data.table)
setDT(df)[, mainmode := recode(mainmode, 'BS' = 'BUS', 
                  'car' = 'car', 
                           'active' = 'walk', 'TX' = 'taxi')][, choice := +(mode == mainmode)]
df
#   mode choice mainmode
#1: taxi      0      BUS
#2: taxi      0      car
#3: taxi      0     walk
#4: taxi      1     taxi

或者在
base R
中,这可以通过命名向量完成

df$mainmode <- setNames(c('BUS', 'car', 'walk', 'taxi'), 
           c('BS', 'car', 'active', 'TX'))[as.character(df$mainmode)]
df$choice <- +(df$mode == df$mainmode)


df$mainmode您可以添加一个您期望输出的示例吗?期望输出将是,选项列变为choice=c(0,0,0,1)。因为TX在mainmode变量的第4行。您可能需要解释更多。更改
选项
中的值的逻辑是什么?在该数据集中,第一列表示观察到的乘客旅行模式,第二列是虚拟变量,其中1=观察到的,0=未观察到的,第三列是第二列的支持变量。我需要将第二列(即选项)0的值替换为1,其中第一列和第三列的值匹配。在这种情况下,第3列的第4行中有TX(即滑行),它与第1列匹配。这就是为什么在“选择”中,我需要将第4行中的0替换为1,将第1行中的1替换为0。您可以添加一个输出预期的示例吗?预期的输出将是,选择列变为choice=c(0,0,0,1)。因为TX在mainmode变量的第4行。您可能需要解释更多。更改
选项
中的值的逻辑是什么?在该数据集中,第一列表示观察到的乘客旅行模式,第二列是虚拟变量,其中1=观察到的,0=未观察到的,第三列是第二列的支持变量。我需要将第二列(即选项)0的值替换为1,其中第一列和第三列的值匹配。在这种情况下,第3列的第4行中有TX(即滑行),它与第1列匹配。这就是为什么在“选择”中,我需要将第4行中的0替换为1,将第1行中的1替换为0。@F Trias:我的主要目标是将第二列(即选择)0的值替换为1,其中第一列和第三列的值匹配。在这种情况下,第3列第4行中的TX(即滑行)与第1列的值相匹配。这就是为什么在“选择”中,我需要将第4行中的0替换为1,将第1行中的1替换为0。使此查询更简单:给定数据=data.frame(mode=c(“出租车”、“出租车”、“出租车”、“出租车”、“出租车”)),选择=c(1,0,0),mainmode=c(“BS”、“car”、“active”、“TX”);目标输出=数据帧(模式=c(“滑行”,“滑行”,“滑行”,“滑行”,“滑行”),选择=c(0,0,0,1),主模式=c(“BS”,“car”,“活动”,“发送”))。如何使用R脚本或函数从给定的数据中获取此目标输出?这就是最后一行的作用。它将选项设置为c(0,0,0,1)。为什么不使用
dput(df)
中的
dput(df)
向我们显示原始数据帧,以便我们可以看到您使用的是什么?您的数据是字符串,而不是因子。因此,您需要将匹配项转换为:
df$choice=as.numeric(df$mode==as.character(df$lookup))
@F Trias:我的主要目标是将第二列(即选项)0的值替换为1,其中第一列和第三列匹配的值。在这种情况下,第3列第4行中的TX(即滑行)与第1列的值相匹配。这就是为什么在“选择”中,我需要将第4行中的0替换为1,将第1行中的1替换为0。使此查询更简单:给定数据=data.frame(mode=c(“出租车”、“出租车”、“出租车”、“出租车”、“出租车”)),选择=c(1,0,0),mainmode=c(“BS”、“car”、“active”、“TX”);目标输出=数据帧(模式=c(“滑行”,“滑行”,“滑行”,“滑行”,“滑行”),选择=c(0,0,0,1),主模式=c(“BS”,“car”,“活动”,“发送”))。如何使用R脚本或函数从给定的数据中获取此目标输出?这就是最后一行的作用。它将选项设置为c(0,0,0,1)。为什么不使用
dput(df)
中的
dput(df)
向我们显示原始数据帧,以便我们可以看到您使用的是什么?您的数据是字符串,而不是因子。因此您需要转换匹配:
df$choice=as.numeric(df$mode==as.character(df$lookup))
非常感谢您。你太棒了!根据我对此查询的预期,您的方法对我来说是100%正确的。保重,亲爱的。“我希望我们将来也能见面。”Ronak Shah,我还有一个问题要问。如果给定数据集中的“mainmode”中没有“TX”,那么我希望选择的值与数据集中的值相同。当数据集中有这两种情况时,如何执行此查询(这意味着数据集中的mainmode中存在或不存在TX)。请提前感谢。您的意思是第一个值将保持为0,因为它不是“TX”?在这种情况下,您可以使用
df%>%mutate(mainmode=recode(mainmode,'BS'='BUS','car'='car','active'='walk','TX'='taxi'),choice=ifelse(mainmode!='taxi',choice,as.integer(mode==mainmode))
非常感谢Ronak。