2014-01-23 1 views
4

У меня есть кадр данных x1, который я сгенерированный с этим кодом,Разделив все числа в кадре данных с помощью выбранной строки в том же кадре данных и соответствующее положение столбца в R

x <- c(1:10) 
y <- x^3 
z <- y-20 
s <- z/3 
t <- s*6 
q <- s*y 
x1 <- cbind(x,y,z,s,t,q) 
x1 <- data.frame(x1) 

    x y z   s t    q 
1 1 1 -19 -6.333333 -38  -6.333333 
2 2 8 -12 -4.000000 -24 -32.000000 
3 3 27 7 2.333333 14  63.000000 
4 4 64 44 14.666667 88 938.666667 
5 5 125 105 35.000000 210 4375.000000 
6 6 216 196 65.333333 392 14112.000000 
7 7 343 323 107.666667 646 36929.666667 
8 8 512 492 164.000000 984 83968.000000 
9 9 729 709 236.333333 1418 172287.000000 
10 10 1000 980 326.666667 1960 326666.666667 

Теперь я хочу разделить эти данные кадра x1 с первой строки одного и того же кадра данных, поэтому я использую эти следующие строки кода, как описано here

x2 <- x1[1,] 
require(stats) 
sweep(x1, 2, x2, `/`) 

таким образом, кадр данных x2 выглядит как это,

x y z   s t   q 
1 1 1 -19 -6.333333 -38 -6.333333 

Конечный результат, который мне нужен, - это каждый из числа в кадре данных, который следует делить на число в x2, соответствующем его собственной позиции столбца. Например, когда строка 3 кадра x1 данных делится на x2 результат должен быть 3 27 -0.368421 -0.368421 -0.368421 -9.947336 Но я получаю Error in Ops.data.frame(x, aperm(array(STATS, dims[perm])

Может кто-то указать, что мне нужно изменить, чтобы получить желаемый результат.

ответ

4

Вы также можете попробовать что-то вроде это:

x1/x1[1, , drop = TRUE] 
#  x y   z   s   t    q 
# 1 1 1 1.0000000 1.0000000 1.0000000  1.000000 
# 2 2 8 0.6315789 0.6315789 0.6315789  5.052632 
# 3 3 27 -0.3684211 -0.3684211 -0.3684211  -9.947368 
# 4 4 64 -2.3157895 -2.3157895 -2.3157895 -148.210526 
# 5 5 125 -5.5263158 -5.5263158 -5.5263158 -690.789474 
# 6 6 216 -10.3157895 -10.3157895 -10.3157895 -2228.210526 
# 7 7 343 -17.0000000 -17.0000000 -17.0000000 -5831.000000 
# 8 8 512 -25.8947368 -25.8947368 -25.8947368 -13258.105263 
# 9 9 729 -37.3157895 -37.3157895 -37.3157895 -27203.210526 
# 10 10 1000 -51.5789474 -51.5789474 -51.5789474 -51578.947368 
+0

+1 Хорошая идея. Проще, чем 'sweep'. –

+0

@ Ананда Махто Это работает как шарм и прямо, приветствует – Amm

4

Проблема заключается в том, что x2 является однострочным кадром данных, а не вектором. Преобразовать его в вектор с unlist и он будет работать:

x2 <- x1[1,] 
sweep(x1, 2, unlist(x2), `/`) 

    x y   z   s   t    q 
1 1 1 1.0000000 1.0000000 1.0000000  1.000000 
2 2 8 0.6315789 0.6315789 0.6315789  5.052632 
3 3 27 -0.3684211 -0.3684211 -0.3684211  -9.947368 
4 4 64 -2.3157895 -2.3157895 -2.3157895 -148.210526 
5 5 125 -5.5263158 -5.5263158 -5.5263158 -690.789474 
6 6 216 -10.3157895 -10.3157895 -10.3157895 -2228.210526 
7 7 343 -17.0000000 -17.0000000 -17.0000000 -5831.000000 
8 8 512 -25.8947368 -25.8947368 -25.8947368 -13258.105263 
9 9 729 -37.3157895 -37.3157895 -37.3157895 -27203.210526 
10 10 1000 -51.5789474 -51.5789474 -51.5789474 -51578.947368 
+0

Это именно то, что мне нужно, отлично! cheers – Amm

2

Включите data.frame в матрицу (поскольку у вас есть только только числовые данные):

x1 <- as.matrix(x1) 

t(t(x1)/x1[1,]) 

     x y   z   s   t    q 
[1,] 1 1 1.0000000 1.0000000 1.0000000  1.000000 
[2,] 2 8 0.6315789 0.6315789 0.6315789  5.052632 
[3,] 3 27 -0.3684211 -0.3684211 -0.3684211  -9.947368 
[4,] 4 64 -2.3157895 -2.3157895 -2.3157895 -148.210526 
[5,] 5 125 -5.5263158 -5.5263158 -5.5263158 -690.789474 
[6,] 6 216 -10.3157895 -10.3157895 -10.3157895 -2228.210526 
[7,] 7 343 -17.0000000 -17.0000000 -17.0000000 -5831.000000 
[8,] 8 512 -25.8947368 -25.8947368 -25.8947368 -13258.105263 
[9,] 9 729 -37.3157895 -37.3157895 -37.3157895 -27203.210526 
[10,] 10 1000 -51.5789474 -51.5789474 -51.5789474 -51578.947368 
+0

Спасибо, это полезное предложение – Amm

 Смежные вопросы

  • Нет связанных вопросов^_^