R 生成列名为零值的字符串
第四栏是我想要的栏。视频、网络研讨会、会议、会议是不同客户(姓名)可以参与的四种类型的活动。您可以看到,在给定的行中,所有具有零值的列名都位于最后一列(NextStep)中,其中的值(用逗号分隔的字符串)排除了具有非零值的列名。最后一列中的字符串(列名)通常按列顺序显示,但有两个例外。如果有零值,网络研讨会总是首先出现;如果有零值,视频总是最后出现R 生成列名为零值的字符串,r,data.table,dplyr,grepl,R,Data.table,Dplyr,Grepl,第四栏是我想要的栏。视频、网络研讨会、会议、会议是不同客户(姓名)可以参与的四种类型的活动。您可以看到,在给定的行中,所有具有零值的列名都位于最后一列(NextStep)中,其中的值(用逗号分隔的字符串)排除了具有非零值的列名。最后一列中的字符串(列名)通常按列顺序显示,但有两个例外。如果有零值,网络研讨会总是首先出现;如果有零值,视频总是最后出现 library(data.table) dt <- fread(' Name Video Webinar Me
library(data.table)
dt <- fread('
Name Video Webinar Meeting Conference NextStep
John 1 0 0 0 Webinar,Meeting,Conference
John 1 1 0 0 Meeting,Conference
John 1 1 1 0 Conference
Tom 0 0 1 0 Webinar,Conference,Video
Tom 0 0 1 1 Webinar,Video
Kyle 0 0 0 1 Webinar,Meeting,Video
')
库(data.table)
dt一种可能的解决方案:
DT[, nextstep := paste0(names(.SD)[.SD==0], collapse = ','), 1:nrow(DT), .SDcols = 2:5][]
其中:
Name Video Webinar Meeting Conference nextstep
1: John 1 0 0 0 Webinar,Meeting,Conference
2: John 1 1 0 0 Meeting,Conference
3: John 1 1 1 0 Conference
4: Tom 0 0 1 0 Video,Webinar,Conference
5: Tom 0 0 1 1 Video,Webinar
6: Kyle 0 0 0 1 Video,Webinar,Meeting
Name Video Webinar Meeting Conference nextstep
1: John 1 0 0 0 Webinar,Meeting,Conference
2: John 1 1 0 0 Meeting,Conference
3: John 1 1 1 0 Conference
4: Tom 0 0 1 0 Webinar,Conference,Video
5: Tom 0 0 1 1 Webinar,Video
6: Kyle 0 0 0 1 Webinar,Meeting,Video
如果要按照注释中指定的顺序排列名称,可以执行以下操作:
lvls <- c('Webinar', 'Meeting', 'Conference', 'Video')
DT[, nextstep := paste0(lvls[lvls %in% names(.SD)[.SD==0]], collapse = ','),
1:nrow(DT), .SDcols = 2:5][]
除了使用paste0
(使用collapse=',
)之外,您还可以使用toString
使用数据:
DT <- fread('Name Video Webinar Meeting Conference
John 1 0 0 0
John 1 1 0 0
John 1 1 1 0
Tom 0 0 1 0
Tom 0 0 1 1
Kyle 0 0 0 1')
DT一个可能的解决方案:
DT[, nextstep := paste0(names(.SD)[.SD==0], collapse = ','), 1:nrow(DT), .SDcols = 2:5][]
其中:
Name Video Webinar Meeting Conference nextstep
1: John 1 0 0 0 Webinar,Meeting,Conference
2: John 1 1 0 0 Meeting,Conference
3: John 1 1 1 0 Conference
4: Tom 0 0 1 0 Video,Webinar,Conference
5: Tom 0 0 1 1 Video,Webinar
6: Kyle 0 0 0 1 Video,Webinar,Meeting
Name Video Webinar Meeting Conference nextstep
1: John 1 0 0 0 Webinar,Meeting,Conference
2: John 1 1 0 0 Meeting,Conference
3: John 1 1 1 0 Conference
4: Tom 0 0 1 0 Webinar,Conference,Video
5: Tom 0 0 1 1 Webinar,Video
6: Kyle 0 0 0 1 Webinar,Meeting,Video
如果要按照注释中指定的顺序排列名称,可以执行以下操作:
lvls <- c('Webinar', 'Meeting', 'Conference', 'Video')
DT[, nextstep := paste0(lvls[lvls %in% names(.SD)[.SD==0]], collapse = ','),
1:nrow(DT), .SDcols = 2:5][]
除了使用paste0
(使用collapse=',
)之外,您还可以使用toString
使用数据:
DT <- fread('Name Video Webinar Meeting Conference
John 1 0 0 0
John 1 1 0 0
John 1 1 1 0
Tom 0 0 1 0
Tom 0 0 1 1
Kyle 0 0 0 1')
DT给你:
setcolorder(dt, c("Name", "Webinar", "Meeting", "Conference", "Video", "NextStep"))
dt[, NextStepNew:=apply(dt, 1, function(x) paste0(names(x)[x==0], collapse=","))][]
Name Webinar Meeting Conference Video NextStep NextStepNew
1: John 0 0 0 1 Webinar,Meeting,Conference Webinar,Meeting,Conference
2: John 1 0 0 1 Meeting,Conference Meeting,Conference
3: John 1 1 0 1 Conference Conference
4: Tom 0 1 0 0 Webinar,Conference,Video Webinar,Conference,Video
5: Tom 0 1 1 0 Webinar,Video Webinar,Video
6: Kyle 0 0 1 0 Webinar,Meeting,Video Webinar,Meeting,Video
给你:
setcolorder(dt, c("Name", "Webinar", "Meeting", "Conference", "Video", "NextStep"))
dt[, NextStepNew:=apply(dt, 1, function(x) paste0(names(x)[x==0], collapse=","))][]
Name Webinar Meeting Conference Video NextStep NextStepNew
1: John 0 0 0 1 Webinar,Meeting,Conference Webinar,Meeting,Conference
2: John 1 0 0 1 Meeting,Conference Meeting,Conference
3: John 1 1 0 1 Conference Conference
4: Tom 0 1 0 0 Webinar,Conference,Video Webinar,Conference,Video
5: Tom 0 1 1 0 Webinar,Video Webinar,Video
6: Kyle 0 0 1 0 Webinar,Meeting,Video Webinar,Meeting,Video
如果您正在寻找一种方法来做到这一点,而不只是按照您想要的顺序对列重新排序(事实上,我看不出有什么理由不这样做,但无论如何……),您可以尝试以下方法。它melt
s并通过连接中的引用进行更新:
lvls <- c("Webinar", "Meeting", "Conference", "Video") # make sure order is correct
dt[, row := .I] # add a row-identifier
dtm <- melt(dt, id.vars = c("Name", "row"), measure.vars = lvls) # melt to long format
# summarise dtm by using factor, sorting it and converting to strin; then join to dt
dt[dtm[value == 0, list(NextStep2 = toString(sort(factor(variable, levels = lvls)))),
by = row], NextStep2 := NextStep2, on = "row"][, row := NULL]
# Name Video Webinar Meeting Conference NextStep NextStep2
# 1: John 1 0 0 0 Webinar,Meeting,Conference Webinar, Meeting, Conference
# 2: John 1 1 0 0 Meeting,Conference Meeting, Conference
# 3: John 1 1 1 0 Conference Conference
# 4: Tom 0 0 1 0 Webinar,Conference,Video Webinar, Conference, Video
# 5: Tom 0 0 1 1 Webinar,Video Webinar, Video
# 6: Kyle 0 0 0 1 Webinar,Meeting,Video Webinar, Meeting, Video
如果您正在寻找一种方法来做到这一点,而不只是按照您想要的顺序对列重新排序(事实上,我看不出有什么理由不这样做,但无论如何……),您可以尝试以下方法。它melt
s并通过连接中的引用进行更新:
lvls <- c("Webinar", "Meeting", "Conference", "Video") # make sure order is correct
dt[, row := .I] # add a row-identifier
dtm <- melt(dt, id.vars = c("Name", "row"), measure.vars = lvls) # melt to long format
# summarise dtm by using factor, sorting it and converting to strin; then join to dt
dt[dtm[value == 0, list(NextStep2 = toString(sort(factor(variable, levels = lvls)))),
by = row], NextStep2 := NextStep2, on = "row"][, row := NULL]
# Name Video Webinar Meeting Conference NextStep NextStep2
# 1: John 1 0 0 0 Webinar,Meeting,Conference Webinar, Meeting, Conference
# 2: John 1 1 0 0 Meeting,Conference Meeting, Conference
# 3: John 1 1 1 0 Conference Conference
# 4: Tom 0 0 1 0 Webinar,Conference,Video Webinar, Conference, Video
# 5: Tom 0 0 1 1 Webinar,Video Webinar, Video
# 6: Kyle 0 0 0 1 Webinar,Meeting,Video Webinar, Meeting, Video
.. 您的问题是,如何创建列NextStep
?什么是dt[,Date:=as.IDate(Date)]
?是的,这是如何创建下一步列。请在您的post@docendodiscimus我道歉。它用于一个日期字段,该字段与此问题不相关。没问题,现在看起来不错。。您的问题是,如何创建列NextStep
?什么是dt[,Date:=as.IDate(Date)]
?是的,这是如何创建下一步列。请在您的post@docendodiscimus我道歉。这是一个日期字段,在这个问题中不相关。没问题,现在看起来不错。谢谢你提供了很棒的解决方案。在下一步2字段中,是否有办法使网络研讨会始终显示在第一位,视频始终显示在最后一位?@gibbz00那么“会议”和“会议”又如何呢?在会议和会议的情况下,我们可以求助于列顺序,即会议在会议之前。感谢您提供了很棒的解决方案。在下一步2字段中,是否有办法使网络研讨会始终显示在第一位,视频始终显示在最后一位?@gibbz00那么“会议”和“会议”又如何呢?在会议和会议的情况下,我们可以采用会议在会议之前的列顺序感谢您的回答!谢谢你的回答!谢谢你提供了很好的解决方案。对于没有任何活动的人,所以所有列都是零,在这种情况下,我想做视频、网络研讨会、会议、会议,就像原始数据框中显示的列顺序一样。非常感谢!谢谢你提供了很好的解决方案。对于没有任何活动的人,所以所有列都是零,在这种情况下,我想做视频、网络研讨会、会议、会议,就像原始数据框中显示的列顺序一样。非常感谢!