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基本上,我的意思是您不应该使用宽格式的数据(其中“数据”存储为列名)执行分析。非常感谢您的详细解释!我从你身上学到了很多。