通过在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$X4tidyverse
备选:
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