如何添加按r中特定级别的值缩放的列?
我有一个这样的数据集(注意标题如何添加按r中特定级别的值缩放的列?,r,R,我有一个这样的数据集(注意标题I、J和Value): 问题: 我想在myData中添加一列(称为RelValue),其值等于value为每个I划分的值,其中J是Z 的方程式如下所示: RelValue(I,J)=Value(I,J)/Value(I|J=Z) 因此,添加的列RelValue应以如下方式结束: RelValue 0.25 0.5 1.0 2.0 3.0 1.0 1/3 2/3 1.0 关于如何做到这一点,有什么想法吗?(来自java,我与循环搏斗了几个小时,但失败了——但我想现在
I
、J
和Value
):
问题:
我想在myData
中添加一列(称为RelValue
),其值等于value
为每个I
划分的值,其中J
是Z
的方程式如下所示:
RelValue(I,J)=Value(I,J)/Value(I|J=Z)
因此,添加的列RelValue
应以如下方式结束:
RelValue
0.25
0.5
1.0
2.0
3.0
1.0
1/3
2/3
1.0
关于如何做到这一点,有什么想法吗?(来自java,我与循环搏斗了几个小时,但失败了——但我想现在我在R中,这一定会更容易些)
提前感谢。我们可以尝试使用
data.table
。将'data.frame'转换为'data.table'(setDT(myData
),按“I”分组,我们将'Value'除以'Value',其中'J'是'Z'(假设每个'I'组中的'J'列只有一个唯一的'Z'),并将其赋值(:=
)以创建一个新列
library(data.table)
setDT(myData)[, RelValue := round(Value/Value[J=="Z"],2) , by = I]
或者使用
dplyr
,我们使用类似的方法
library(dplyr)
myData %>%
group_by(I) %>%
mutate(RelValue = round(Value/Value[J=="Z"], 2))
# I J Value RelValue
# <fctr> <fctr> <int> <dbl>
#1 A X 5 0.25
#2 A Y 10 0.50
#3 A Z 20 1.00
#4 B X 80 2.00
#5 B Y 120 3.00
#6 B Z 40 1.00
#7 C X 30 0.33
#8 C Y 60 0.67
#9 C Z 90 1.00
下面是另一个基本R方法,使用
split
和lappy
:
unlist(lapply(split(myData, myData$I), function(i) {
round(i$Value / i[i$J == "Z", "Value"], 2)}))
split
函数按I对data.frame进行分区。然后lappy
循环遍历每个分区并应用该函数。最后,由于lappy
返回一个列表,我们使用unlist
将其转换为向量
with(myData, round(Value/ave(Value * (J=="Z"), I, FUN = max),2))
#[1] 0.25 0.50 1.00 2.00 3.00 1.00 0.33 0.67 1.00
unlist(lapply(split(myData, myData$I), function(i) {
round(i$Value / i[i$J == "Z", "Value"], 2)}))