Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/23.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_Data.table_Pipe - Fatal编程技术网

R表示组是否有值

R表示组是否有值,r,data.table,pipe,R,Data.table,Pipe,除了“NEWVAR”之外,我还有所有列的“data”,我希望这样创建它: 如果某个特定“组”的分数为%SCORE中的1%,则“NEWVAR”的值为“1” 如果%SCORE和score1中的score2%不在特定“组”的分数中,则使用dplyr将值“2”赋予“NEWVAR”: 输入%select NEWVAR 输入%>% 组\按组%>% mutateNEWVAR=当分数%1~1中的任何分数%, %score2中的anySCORE%&!分数%1~2中的分数% 使用dplyr: 输入%select N

除了“NEWVAR”之外,我还有所有列的“data”,我希望这样创建它:

如果某个特定“组”的分数为%SCORE中的1%,则“NEWVAR”的值为“1”

如果%SCORE和score1中的score2%不在特定“组”的分数中,则使用dplyr将值“2”赋予“NEWVAR”

输入%select NEWVAR 输入%>% 组\按组%>% mutateNEWVAR=当分数%1~1中的任何分数%, %score2中的anySCORE%&!分数%1~2中的分数% 使用dplyr:

输入%select NEWVAR 输入%>% 组\按组%>% mutateNEWVAR=当分数%1~1中的任何分数%, %score2中的anySCORE%&!分数%1~2中的分数%
因为您已经在data.table语法中使用ifelse对此进行了标记


我认为data.table的开发版本中也有fcase,它类似于dplyr中的case_,使编写这种嵌套的ifelse变得容易

因为您已在data.table语法中使用ifelse对此进行了标记

我认为data.table的开发版本中也有fcase,它类似于dplyr中的case_,使编写这种嵌套的ifelse变得容易

我们可以在data.table中使用fifelse

或者使用data.table的devel版本中的fcase

我们可以在data.table中使用fifelse

或者使用data.table的devel版本中的fcase


@也许你有个好主意!!我发布了一个data.table解决方案。请查收。thanks@akrun也许你有个好主意!!我发布了一个data.table解决方案。请查收。非常感谢,太棒了。我的问题是,如果一个组在score1和score2中都有分数,我该如何澄清以覆盖该问题?在这些情况下,我该如何指定在NEWVAR中始终输入“1”?这仅仅是if语句的顺序吗?是的,这是我们在其中设置的条件的顺序。因此,如果%score1中的anySCORE%为真,即使%score2中的anySCORE%为真,它也将始终返回1。这太好了,谢谢。我最后一个想法是为什么使用“ifelse”而不是“fifelse”?没有具体原因。在这种情况下,两者的工作方式是相似的。非常感谢,这太棒了。我的问题是,如果一个组在score1和score2中都有分数,我该如何澄清以覆盖该问题?在这些情况下,我该如何指定在NEWVAR中始终输入“1”?这仅仅是if语句的顺序吗?是的,这是我们在其中设置的条件的顺序。因此,如果%score1中的anySCORE%为真,即使%score2中的anySCORE%为真,它也将始终返回1。这太好了,谢谢。我最后一个想法是为什么使用“ifelse”而不是“fifelse”?没有具体原因。在这种情况下,两者的工作方式相似。
data=data.frame(GROUP=c(1,1,1,2,2,2,3,3,3,4,4,4),
VAR=c('A','B','C','A','B','C','A','B','C','A','B','C'),
SCORE=c(3,6,NA,NA,NA,NA,1,NA,5,5,2,NA),
NEWVAR=c(1,1,1,NA,NA,NA,2,2,2,1,1,1))

score1 = c(2,3,7)
score2 = c(0,5,6)
scores = list(score1, score2)
ave(data$SCORE, data$GROUP, FUN = function(x){
    chk = sapply(scores, function(y) any(y %in% x))
    seq_along(scores)[chk][1]
})
# [1]  1  1  1 NA NA NA  2  2  2  1  1  1
library(data.table)

setDT(data)[, NEWVAR := ifelse(any(SCORE %in% score1), 1, 
                          ifelse(any(SCORE %in% score2), 2, NA_integer_)), GROUP]

data
#    GROUP VAR SCORE NEWVAR
# 1:     1   A     3      1
# 2:     1   B     6      1
# 3:     1   C    NA      1
# 4:     2   A    NA     NA
# 5:     2   B    NA     NA
# 6:     2   C    NA     NA
# 7:     3   A     1      2
# 8:     3   B    NA      2
# 9:     3   C     5      2
#10:     4   A     5      1
#11:     4   B     2      1
#12:     4   C    NA      1
library(data.table)

setDT(data)[, NEWVAR := fifelse(any(SCORE %in% score1), 1, 
                          fifelse(any(SCORE %in% score2), 2, NA_integer_)), GROUP]

data
#     GROUP VAR SCORE NEWVAR
# 1:     1   A     3      1
# 2:     1   B     6      1
# 3:     1   C    NA      1
# 4:     2   A    NA     NA
# 5:     2   B    NA     NA
# 6:     2   C    NA     NA
# 7:     3   A     1      2
# 8:     3   B    NA      2
# 9:     3   C     5      2
#10:     4   A     5      1
#11:     4   B     2      1
#12:     4   C    NA      1
setDT(data)[, NEWVAR := fcase(any(SCORE %in% score1), 1,
                              any(SCORE %in% score2), 2,
                               default = NA_integer_), GROUP]