2013-06-19 11 views
0

У меня есть набор данных, глядя, как это:Изменение значений переменных в зависимости от фактора

Руководитель

structure(list(A = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", 
"14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", 
"25", "26", "27", "28", "29", "30", "31", "32", "33", "34", "35", 
"36", "37", "38", "39", "40", "41", "42", "43", "44", "45", "46", 
"47", "48", "49", "50", "51", "52", "53", "54", "55", "56", "57", 
"58", "59", "60", "61", "62", "63", "64", "65", "66", "67", "68", 
"69", "70", "71", "72", "73", "74", "75", "76", "77", "78", "79", 
"80", "81", "82", "83", "84", "85", "86", "87", "88", "89", "90", 
"91", "92", "93", "94", "95", "96", "97", "98", "99", "100", 
"101", "102", "103", "104", "105", "106", "107", "108", "109", 
"110"), class = "factor"), T = c(0.1, 0.2, 0.3, 0.4, 0.5, 0.6 
), X = c(528.04, 528.04, 528.04, 528.04, 528.04, 528.04), Y = c(10.32, 
10.32, 10.32, 10.32, 10.32, 10.32), V = c(0, 0, 0, 0, 0, 0), 
    GD = c(0, 0, 0, 0, 0, 0), ND = c(NA, 0, 0, 0, 0, 0), ND2 = c(NA, 
    0, 0, 0, 0, 0), TID = structure(c(1L, 1L, 1L, 1L, 1L, 1L), .Label = c("t1", 
    "t10", "t100", "t101", "t102", "t103", "t104", "t105", "t106", 
    "t107", "t108", "t109", "t11", "t110", "t12", "t13", "t14", 
    "t15", "t16", "t17", "t18", "t19", "t2", "t20", "t21", "t22", 
    "t23", "t24", "t25", "t26", "t27", "t28", "t29", "t3", "t30", 
    "t31", "t32", "t33", "t34", "t35", "t36", "t37", "t38", "t39", 
    "t4", "t40", "t41", "t42", "t43", "t44", "t45", "t46", "t47", 
    "t48", "t49", "t5", "t50", "t51", "t52", "t53", "t54", "t55", 
    "t56", "t57", "t58", "t59", "t6", "t60", "t61", "t62", "t63", 
    "t64", "t65", "t66", "t67", "t68", "t69", "t7", "t70", "t71", 
    "t72", "t73", "t74", "t75", "t76", "t77", "t78", "t79", "t8", 
    "t80", "t81", "t82", "t83", "t84", "t85", "t86", "t87", "t88", 
    "t89", "t9", "t90", "t91", "t92", "t93", "t94", "t95", "t96", 
    "t97", "t98", "t99"), class = "factor")), .Names = c("A", 
"T", "X", "Y", "V", "GD", "ND", "ND2", "TID"), row.names = c(NA, 
6L), class = "data.frame") 

хвост:

structure(list(A = structure(c(110L, 110L, 110L, 110L, 110L, 
110L), .Label = c("1", "2", "3", "4", "5", "6", "7", "8", "9", 
"10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", 
"21", "22", "23", "24", "25", "26", "27", "28", "29", "30", "31", 
"32", "33", "34", "35", "36", "37", "38", "39", "40", "41", "42", 
"43", "44", "45", "46", "47", "48", "49", "50", "51", "52", "53", 
"54", "55", "56", "57", "58", "59", "60", "61", "62", "63", "64", 
"65", "66", "67", "68", "69", "70", "71", "72", "73", "74", "75", 
"76", "77", "78", "79", "80", "81", "82", "83", "84", "85", "86", 
"87", "88", "89", "90", "91", "92", "93", "94", "95", "96", "97", 
"98", "99", "100", "101", "102", "103", "104", "105", "106", 
"107", "108", "109", "110"), class = "factor"), T = c(180.5, 
180.6, 180.7, 180.8, 180.9, 181), X = c(380.12, 380.12, 380.12, 
378.4, 378.4, 378.4), Y = c(493.64, 493.64, 493.64, 493.64, 491.92, 
491.92), V = c(4.8649, 7.6921, 7.6921, 6.88, 3.44, 3.44), GD = c(1492.4688, 
1500.1609, 1507.853, 1514.733, 1518.173, 1521.613), ND = c(94.9745313228762, 
94.9745313228762, 94.9745313228762, 96.3814089957187, 97.3738774004609, 
97.3738774004609), ND2 = c(9020.16159999999, 9020.16159999999, 
9020.16159999999, 9289.376, 9481.67199999999, 9481.67199999999 
), TID = structure(c(14L, 14L, 14L, 14L, 14L, 14L), .Label = c("t1", 
"t10", "t100", "t101", "t102", "t103", "t104", "t105", "t106", 
"t107", "t108", "t109", "t11", "t110", "t12", "t13", "t14", "t15", 
"t16", "t17", "t18", "t19", "t2", "t20", "t21", "t22", "t23", 
"t24", "t25", "t26", "t27", "t28", "t29", "t3", "t30", "t31", 
"t32", "t33", "t34", "t35", "t36", "t37", "t38", "t39", "t4", 
"t40", "t41", "t42", "t43", "t44", "t45", "t46", "t47", "t48", 
"t49", "t5", "t50", "t51", "t52", "t53", "t54", "t55", "t56", 
"t57", "t58", "t59", "t6", "t60", "t61", "t62", "t63", "t64", 
"t65", "t66", "t67", "t68", "t69", "t7", "t70", "t71", "t72", 
"t73", "t74", "t75", "t76", "t77", "t78", "t79", "t8", "t80", 
"t81", "t82", "t83", "t84", "t85", "t86", "t87", "t88", "t89", 
"t9", "t90", "t91", "t92", "t93", "t94", "t95", "t96", "t97", 
"t98", "t99"), class = "factor")), .Names = c("A", "T", "X", 
"Y", "V", "GD", "ND", "ND2", "TID"), row.names = 80419:80424, class = "data.frame") 

Я хочу, чтобы изменить значения Т в данных в зависимости от A. Ex. данные имеют диапазон 0,1-181 с интервалом 0,1. Для каждого А Т не всегда начинается с 0,1, и это то, что я хочу сделать. (Так что T всегда начиналось бы с 0,1 при каждом изменении A). Я пытался сделать Т = 0 первыми:

> NM$T=NULL 

Затем я попытался с помощью sapply, но с треском провалился. Любая помощь будет замечательной.

Благодаря

+2

Но столбец А 1 во всех строках в вашем примере ... Как вы хотите изменить T всякий раз, когда изменения? – user1981275

+0

A может быть задан как фактор с «NM $ A = as.factor (NM $ A)» – Kaye11

ответ

3

Как обычно, это делается проще всего в data.table:

library(data.table) 
dt = data.table(your_df) 

dt[, T := seq(from = 0.1, by = 0.1, length.out = .N), by = A] 

Вот пример:

dt = data.table(A = c(1,1,1,2,2), B = 2) 
dt[, T := seq(from = 0.1, by = 0.1, length.out = .N), by = A] 
dt 
# A B T 
#1: 1 2 0.1 
#2: 1 2 0.2 
#3: 1 2 0.3 
#4: 2 2 0.1 
#5: 2 2 0.2 
+0

Я не если это сработало, так как мои данные стали атомарными переменными. :) – Kaye11

+0

Извините, я не понимаю, что вы пытаетесь сказать. Вероятно, вы хотите изменить свой вопрос и добавить две вещи - нетривиальный пример, который содержит не более одного значения «A» и желаемого результата для этого примера. – eddi

+0

В порядке, я конвертирую его в as.data.frame Теперь проверяем, если он сработал – Kaye11

1

Если вы хотите T быть последовательность, начиная с 0,1 и увеличивается на 0,1 для каждой группы, определенной колонке A, вы можете использовать следующий код:

DF$A <- sample(LETTERS[1:3],20,T) # fake data 

#> DF$A 
# [1] "B" "C" "C" "C" "B" "B" "A" "C" "A" "C" "B" "C" "B" "B" "A" "C" "C" "A" "A" "C" 

DF$T <- ave(as.integer(DF$A), DF$A, FUN=function(x)seq(from=0.1,by=0.1,length.out=length(x))) 

Результат:

> DF[order(DF$A),] 
    A T 
1 A 0.1 
2 A 0.2 
3 A 0.3 
4 A 0.4 
5 A 0.5 
6 B 0.1 
7 B 0.2 
8 B 0.3 
9 B 0.4 
10 B 0.5 
11 B 0.6 
12 C 0.1 
13 C 0.2 
14 C 0.3 
15 C 0.4 
16 C 0.5 
17 C 0.6 
18 C 0.7 
19 C 0.8 
20 C 0.9 
+0

Появилась ошибка: было обнаружено 50 или более предупреждений (используйте предупреждения(), чтобы увидеть первые 50) > предупреждения () Предупреждающие сообщения: 1: В '[<-. Factor' (' * tmp * ', i, value = c (0,1, 0,2, 0,3, 0,4, ...: Недопустимый коэффициент, генерируемый NA – Kaye11

+0

@ Kaye11, потому что у вас уже есть столбец 'T', который является фактором в вашем фреймворке данных. Попробуйте использовать что-то вроде' T_new' или сначала удалите 'T'. –

+0

используя это: DF $ TR <- ave (DF $ A, DF $ A, FUN = функция (x) seq (от = 0,1, на = 0,1, length.out = length (x))) произвели ту же ошибку. – Kaye11

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