R 生成列名为零值的字符串

R 生成列名为零值的字符串,r,data.table,dplyr,grepl,R,Data.table,Dplyr,Grepl,第四栏是我想要的栏。视频、网络研讨会、会议、会议是不同客户(姓名)可以参与的四种类型的活动。您可以看到,在给定的行中,所有具有零值的列名都位于最后一列(NextStep)中,其中的值(用逗号分隔的字符串)排除了具有非零值的列名。最后一列中的字符串(列名)通常按列顺序显示,但有两个例外。如果有零值,网络研讨会总是首先出现;如果有零值,视频总是最后出现 library(data.table) dt <- fread(' Name Video Webinar Me

第四栏是我想要的栏。视频、网络研讨会、会议、会议是不同客户(姓名)可以参与的四种类型的活动。您可以看到,在给定的行中,所有具有零值的列名都位于最后一列(NextStep)中,其中的值(用逗号分隔的字符串)排除了具有非零值的列名。最后一列中的字符串(列名)通常按列顺序显示,但有两个例外。如果有零值,网络研讨会总是首先出现;如果有零值,视频总是最后出现

    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那么“会议”和“会议”又如何呢?在会议和会议的情况下,我们可以采用会议在会议之前的列顺序感谢您的回答!谢谢你的回答!谢谢你提供了很好的解决方案。对于没有任何活动的人,所以所有列都是零,在这种情况下,我想做视频、网络研讨会、会议、会议,就像原始数据框中显示的列顺序一样。非常感谢!谢谢你提供了很好的解决方案。对于没有任何活动的人,所以所有列都是零,在这种情况下,我想做视频、网络研讨会、会议、会议,就像原始数据框中显示的列顺序一样。非常感谢!