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

如何添加按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)}))