Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/math/3.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 带有嵌套data.table语句的Ifelse语句_R_If Statement_Data.table_Dplyr - Fatal编程技术网

R 带有嵌套data.table语句的Ifelse语句

R 带有嵌套data.table语句的Ifelse语句,r,if-statement,data.table,dplyr,R,If Statement,Data.table,Dplyr,这是我的数据框 library(data.table) dt <- fread(' Name Video Webinar Meeting Conference Level NextStep John 1 0 0 0 1 Webinar,Meeting,Conference John 1 1 0 0 1 Meeti

这是我的数据框

library(data.table)
     dt <- fread('
 Name     Video   Webinar Meeting Conference  Level  NextStep
  John       1         0        0       0      1     Webinar,Meeting,Conference
  John       1         1        0       0      1     Meeting,Conference
  John       1         1        1       0      2     Conference      
  Tom        0         0        1       0      1     Webinar,Conference,Video
  Tom        0         0        1       1      2     Webinar,Video   
  Kyle       0         0        0       1      2     Webinar,Meeting,Video

                                ')
根据这里的解决方案

现在,我想根据“级别”字段更改元素在下一步列中的显示顺序。例如,如果是级别1,我希望会议在网络研讨会和会议之前出现。如果是2级,我希望视频总是最后出现。这是我的尝试

 dt<-dt[, NextStep := ifelse(Level1=="Level0",
(paste0(names(.SD)[.SD==0], collapse = ';'), 1:nrow(dt), .SDcols = c(5,2,3,4)),
      ifelse(EngagementLevel1=="Level2",
(paste0(names(.SD)[.SD==0], collapse = ';'), 1:nrow(dt), .SDcols = c(3,4,5,2))))]

dt好吧,你可以把你喜欢的订单放在某个地方:

levelmap = data.table(Level = 1:2, ord = list(
    c("Conference", "Webinar", "Meeting", "Video"), 
    c("Webinar", "Meeting", "Conference", "Video")
))
然后使用之前的方法:

DT[, r := .I]
for (ii in seq(nrow(levelmap)))
    DT[ Level == levelmap$Level[ii], 
      ns := paste0(names(.SD)[.SD==0], collapse = ',')
    , by = r, .SDcols = levelmap$ord[[ii]] ][]

但事实上,我认为你根本不应该这样做(这个问题和上一个问题都是这样)。这是一种混乱的数据处理方式

对整洁的数据发表评论。为了澄清我的意思,我建议回顾一下哈德利·维克汉姆的观点。这里的整洁数据可能如下所示:

myDT = melt(
  DT[, !"NextStep", with=FALSE][, Seq := 1:.N, by=Name], 
  id.var = c("Name", "Seq", "Level"))

    Name Seq Level   variable value
 1: John   1     1      Video     1
 2: John   2     1      Video     1
 3: John   3     2      Video     1
 4:  Tom   1     1      Video     0
 5:  Tom   2     2      Video     0
 6: Kyle   1     2      Video     0
 7: John   1     1    Webinar     0
 8: John   2     1    Webinar     1
 9: John   3     2    Webinar     1
10:  Tom   1     1    Webinar     0
11:  Tom   2     2    Webinar     0
12: Kyle   1     2    Webinar     0
13: John   1     1    Meeting     0
14: John   2     1    Meeting     0
15: John   3     2    Meeting     1
16:  Tom   1     1    Meeting     1
17:  Tom   2     2    Meeting     1
18: Kyle   1     2    Meeting     0
19: John   1     1 Conference     0
20: John   2     1 Conference     0
21: John   3     2 Conference     0
22:  Tom   1     1 Conference     0
23:  Tom   2     2 Conference     1
24: Kyle   1     2 Conference     1
    Name Seq Level   variable value
或者,您甚至可以删除所有为0或为1的行(因为它们是相当冗余的)

其想法是,这将是您用于进行任何分析或构建任何汇总表的主要数据。在您的例子中,目标是一个汇总表(据我所知),如

如果确实需要0/1列,还可以将它们与
dcast
(将数据从长转换为宽)一起包含:


好吧,你可以把你喜欢的订单放在某个地方:

levelmap = data.table(Level = 1:2, ord = list(
    c("Conference", "Webinar", "Meeting", "Video"), 
    c("Webinar", "Meeting", "Conference", "Video")
))
然后使用之前的方法:

DT[, r := .I]
for (ii in seq(nrow(levelmap)))
    DT[ Level == levelmap$Level[ii], 
      ns := paste0(names(.SD)[.SD==0], collapse = ',')
    , by = r, .SDcols = levelmap$ord[[ii]] ][]

但事实上,我认为你根本不应该这样做(这个问题和上一个问题都是这样)。这是一种混乱的数据处理方式

对整洁的数据发表评论。为了澄清我的意思,我建议回顾一下哈德利·维克汉姆的观点。这里的整洁数据可能如下所示:

myDT = melt(
  DT[, !"NextStep", with=FALSE][, Seq := 1:.N, by=Name], 
  id.var = c("Name", "Seq", "Level"))

    Name Seq Level   variable value
 1: John   1     1      Video     1
 2: John   2     1      Video     1
 3: John   3     2      Video     1
 4:  Tom   1     1      Video     0
 5:  Tom   2     2      Video     0
 6: Kyle   1     2      Video     0
 7: John   1     1    Webinar     0
 8: John   2     1    Webinar     1
 9: John   3     2    Webinar     1
10:  Tom   1     1    Webinar     0
11:  Tom   2     2    Webinar     0
12: Kyle   1     2    Webinar     0
13: John   1     1    Meeting     0
14: John   2     1    Meeting     0
15: John   3     2    Meeting     1
16:  Tom   1     1    Meeting     1
17:  Tom   2     2    Meeting     1
18: Kyle   1     2    Meeting     0
19: John   1     1 Conference     0
20: John   2     1 Conference     0
21: John   3     2 Conference     0
22:  Tom   1     1 Conference     0
23:  Tom   2     2 Conference     1
24: Kyle   1     2 Conference     1
    Name Seq Level   variable value
或者,您甚至可以删除所有为0或为1的行(因为它们是相当冗余的)

其想法是,这将是您用于进行任何分析或构建任何汇总表的主要数据。在您的例子中,目标是一个汇总表(据我所知),如

如果确实需要0/1列,还可以将它们与
dcast
(将数据从长转换为宽)一起包含:


非常感谢你的回答,弗兰克。当你说这是一种混乱的数据处理方式时,请告诉我你指的是什么。您是指我生成下一步列的方式吗?@gibbz00基本上,我的意思是您不应该使用宽格式的数据(其中“数据”存储为列名)执行分析。非常感谢您的详细解释!我从你身上学到了很多。非常感谢你回答弗兰克。当你说这是一种混乱的数据处理方式时,请告诉我你指的是什么。您是指我生成下一步列的方式吗?@gibbz00基本上,我的意思是您不应该使用宽格式的数据(其中“数据”存储为列名)执行分析。非常感谢您的详细解释!我从你身上学到了很多。