Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/r/68.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 - Fatal编程技术网

通过在R中的数据表中的行上添加条件来创建新列

通过在R中的数据表中的行上添加条件来创建新列,r,data.table,R,Data.table,就像标题一样,描述起来很复杂,所以我只展示代码,我得到了什么,我希望它是什么 set.seed(1) df<-data.frame('X1'=rnorm(10), 'X2'=rnorm(10), 'X3'=c(c(rep('A',5)),c(rep('B',5)))) ## create a bew column 'SPX2' which is the smallest positive number OF X2 ## of

就像标题一样,描述起来很复杂,所以我只展示代码,我得到了什么,我希望它是什么

set.seed(1)
df<-data.frame('X1'=rnorm(10),
               'X2'=rnorm(10),
               'X3'=c(c(rep('A',5)),c(rep('B',5))))

## create a bew column 'SPX2' which is the smallest positive number OF X2 
## of each group(A and B)

require(data.table)
setDT(df)[X2>0,SPX2:=min(X2),by=X3]
df
我想要的是:

            X1          X2 X3      SPX2
 1: -0.6264538  1.51178117  A 0.3898432
 2:  0.1836433  0.38984324  A 0.3898432
 3: -0.8356286 -0.62124058  A 0.3898432
 4:  1.5952808 -2.21469989  A 0.3898432
 5:  0.3295078  1.12493092  A 0.3898432
 6: -0.8204684 -0.04493361  B 0.5939013
 7:  0.4874291 -0.01619026  B 0.5939013
 8:  0.7383247  0.94383621  B 0.5939013
 9:  0.5757814  0.82122120  B 0.5939013
10: -0.3053884  0.59390132  B 0.5939013

因为我想创建一个新列
df$X4
tidyverse
备选:

df %>%
  group_by(X3) %>%
  mutate(SPX2 = min(X2[X2>0]))
其中:

           X1          X2     X3      SPX2
        <dbl>       <dbl> <fctr>     <dbl>
 1 -0.6264538  1.51178117      A 0.3898432
 2  0.1836433  0.38984324      A 0.3898432
 3 -0.8356286 -0.62124058      A 0.3898432
 4  1.5952808 -2.21469989      A 0.3898432
 5  0.3295078  1.12493092      A 0.3898432
 6 -0.8204684 -0.04493361      B 0.5939013
 7  0.4874291 -0.01619026      B 0.5939013
 8  0.7383247  0.94383621      B 0.5939013
 9  0.5757814  0.82122120      B 0.5939013
10 -0.3053884  0.59390132      B 0.5939013
x1x2x3spx2
1-0.6264538 1.51178117 A 0.3898432
2 0.1836433 0.38984324 A 0.3898432
3-0.8356286-0.62124058 A 0.3898432
4 1.5952808-2.21469989 A 0.3898432
5 0.3295078 1.12493092 A 0.3898432
6-0.8204684-0.04493361 B 0.5939013
7 0.4874291-0.01619026 B 0.5939013
8 0.7383247 0.94383621 B 0.5939013
9 0.5757814 0.82122120 B 0.5939013
10-0.3053884 0.59390132 B 0.5939013

使用
数据。表
包:

setDT(df)    
df[,SPX2:=min(X2[X2 > 0]),by=X3]
这是针对
X3
的每个值,以及
X2
的正值子集(即
X2[X2>0]
),然后取所有正值的最小值。请注意,如果没有正值(即
X2[X2>0]
为空),则结果值将为
Inf
。请记住这一点,特别是如果您想使用
SPX2
进行任何进一步的计算

根据您的问题
X2[X2>0]
工作的原因,可以这样考虑:对于
X3
的每个值,都会返回一个
X2
对应值的向量。现在,您可以在此向量上执行常规向量操作,其中之一是通过
X2>0
进行子集设置。其工作原理非常类似于以下内容:

x2 = c(-1, 1, 2, 3, -2, 4)
x2[x2 > 0]
# [1] 1 2 3 4

希望这有帮助

这应该有效:
setDT(df)[,SPX2:=min(X2[X2>0]),by=X3]
。我已经在minimum子句中添加了这个条件,这样minimum将接管所有大于零的X2。谢谢@jav,您的代码已被检查,工作正常。从来没有意识到这样强加的条件,很有启发性!你为什么不把它作为答案,并解释一下为什么我们可以做
X2[X2>0]
来帮助其他需要它的人和我学习。顺便说一句,我可以把它作为这个问题的答案。谢谢@Ronak Shah的编辑,它使这个问题更具可读性和可理解性。我会注意到我在以后的帖子中可能会遇到这样的问题。@jav你可能想添加你的评论作为答案。@JasonGoal,作为答案添加,并做一些解释。Thanks@Aramis7d,很好的解决方案,我把它作为这个问题的答案。
x2 = c(-1, 1, 2, 3, -2, 4)
x2[x2 > 0]
# [1] 1 2 3 4