基于R数据帧中其他列的值缩放列的有效方法

时间:2016-04-01 10:51:42

标签: r dataframe scale

我想根据另一个列中的值缩放dataframe列中的值。例如,这是一个简单的例子

d<-data.frame(x=runif(5,0,10),y=sample(c(1,2),size=5,replace=TRUE))

给出输出:

         x  y
1 1.0895865 2
2 0.8261554 2
3 5.3503761 2
4 3.3940759 1
5 6.2786637 1

我想根据y值缩放x值,所以我想要的是:

(x|y=1 - average(x's | y=1))/std.dev(x's|y=1)

然后将d中的x值替换为缩放值,类似于使用x的{​​{1}}值。

到目前为止我所做的有点笨重:

y=2

然后将所有结果绑定在一个大数据框中,但这有点单调乏味,因为我的实际数据有70个不同的y值,我想为多个(不同的)列执行此操作。

3 个答案:

答案 0 :(得分:2)

您可以使用group_by包中的mutatedplyr轻松完成此操作:

require(dplyr)
d %>% 
  group_by(y) %>% 
  mutate(x = (x - mean(x)) / sd(x))

答案 1 :(得分:1)

此任务通常由group by dplyrscale使用 library(dplyr) d %>% group_by(y) %>% mutate(x2=scale(x))

执行
int arr1[] = { 3, 9, 6, 7 }, arr2[] = { 2, 5, 1 }, arr3[] = { 0 },
arr4[] = { 1, 6 }, arr5[] = { 4, 5, 6, 2, 1 };
int* pointersArray[5] = { &arr1, &arr2, &arr3, &arr4, &arr5 };    
for (k = 0; k< 5; k++)
{
    for (i = 0; i < **(pointersArray + k)+1; i++)
    {
        for (j = i + 1; j < **(pointersArray + k); ++j)
        {
            if ((*(*(pointersArray + k) + i)) > *(*(pointersArray + k) + j))
            {
                temp = *(*(pointersArray + k) + i);
                *(*(pointersArray + k) + i) = *(*(pointersArray + k) + j);
                *(*(pointersArray + k) + j) = temp;
            }
        }
        printf("\n");
    }
}
for (j = 0; j < 5; j++)
{
    for (i = 0; i < **(pointersArray + j) + 1; i++)
    {
        printf("%d", *(*(pointersArray + j) + i));
    }
    printf(" ");
}

答案 2 :(得分:0)

我们可以使用data.table。我们将'data.frame'转换为'data.table'(setDT(d)),按'b'分组,分配(:=)'{1}}'x'到'x2'

scale