Molbiol.ru | Project | Protocols | Programs | Literature Web | Companies | Marketplace | Labor exchange Today's active topics [ Log In* | Register* ] Forum: | |
PS2004R Advanced Member |
(DSV2015 @ 12.10.2019 12:40) PS2004R C NA в исходном векторе работает хорошо. Но если взять исходный вектор без NA(чтобы не путаться) и прибавлять к x1 не 0.5*x1, а лаг от x1(при сдвиге появляется NA), то не работает. "Укоротите" индекс по которому обходите ряд соответственно размеру окна. Или пишите код функции учитывая переменную ширину окна. Это целиком ваше решение, со стороны какое решение будет корректным не видно. |
DSV2015 |
(PS2004R @ 12.10.2019 13:47) "Укоротите" индекс по которому обходите ряд соответственно размеру окна. Или пишите код функции учитывая переменную ширину окна. Это целиком ваше решение, со стороны какое решение будет корректным не видно. Вчера мучался, не получилось. Надо как то вставить игнорирование NA, то есть если NA в одном из аргументов функции, то возвращаем NA, если числа - считаем дальше. Из предыдущего примера должно получится следующее- 1 2 3 исходный вектор + NA 1 2 лаг от него = NA 3 5 дальше берем полученое и прибавляем к нему его же лаг + NA NA 3 = NA NA 8 конечный результат Должно получится 1 NA NA 2 3 NA 3 5 8 Своя функция работает нормально, возвращает NA. CODE > plus <- function(a, b) a + b > > x <- 1:3 # исходный вектор x > Lag1x <- c(NA, head(x, -1)) # лаг от x(появляется NA при сдвиге) > x; Lag1x [1] 1 2 3 [1] NA 1 2 > plus(x, Lag1x) [1] NA 3 5 This post has been edited by DSV2015: 12.10.2019 13:28 |
PS2004R Advanced Member |
(DSV2015 @ 12.10.2019 13:15) "Укоротите" индекс по которому обходите ряд соответственно размеру окна. Или пишите код функции учитывая переменную ширину окна. |
ПолинаШ Member |
"asd",'jjjh", "break", "hasf", "break", "ljs", "kjhh", "nk", "break" где "break" - терм-разделитель. Необходимо закодировать подпоследовательности, т.е. сформировать вектор 1, 1, 1, 2, 2, 3, 3, 3, 3 Последовательность может не заканчиваться "break" (он даже вообще может отсутствовать). Уверена, что есть какая-то готовая опубликованная функция, поэтому очень не хочется заниматься самовязом (тем более, что имею дело с long data). Заранее благодарна за возможные подсказки. |
PS2004R Advanced Member |
(ПолинаШ @ 10.11.2019 10:54) Есть последовательность типа "asd",'jjjh", "break", "hasf", "break", "ljs", "kjhh", "nk", "break" где "break" - терм-разделитель. Необходимо закодировать подпоследовательности, т.е. сформировать вектор 1, 1, 1, 2, 2, 3, 3, 3, 3 Последовательность может не заканчиваться "break" (он даже вообще может отсутствовать). Уверена, что есть какая-то готовая опубликованная функция, поэтому очень не хочется заниматься самовязом (тем более, что имею дело с long data). Заранее благодарна за возможные подсказки. Это простая операция в базовом R? находите все индексы стопов. index.stop <- which(v=="break"]) потом генерите свою последовательность с помощью seq() PS Что за "большие данные" и в чем их содержите не сказано, поэтому подсказать дальше не могу. |
Алекс3212 |
Изначально задача у меня была такая: Есть некоторая таблица из файла Excel, которая выглядит следующим образом на рисунке: где V1- это номер файла наблюдения в котором содержатся V2 и V3, V4 не имеет значения Мне необходимо посчитать, количество подряд идущих значений V2+V3 в каждом V1. Для этого я решил, объединить V1 V2 и V3 в одну переменную ffprpk, сделал столбец дубль этой переменной prpkD, отсортировал в порядке возрастания переменную ffprpk, сместил дубль переменной V1 V2 V3 на одно значение вниз и вычел смещенный дубль из несмещенного, таким образом если значения идут по порядку, то в новом столбце пишется 1, если порядок переменной ffprpk прерывается, то получается иное значное значение, далее я могу отфильтровать только значения с 1.... Далее были планы каким то образом убрать из переменной ffprpk два последних знака, чтобы оставить только 1 и сгрупировать, просумировать данные, тогда я получу по каждому V1 количество идущих подряд V2+V3...не могу понять как убрать два последних числа в переменной и может быть, код можно сделать компактнее если пойти иным путем, пытался применить циклы к этой задаче, но так и не разобрался с ними... P.S. почему я решил убрать 2 знака из переменной ffprpk на этом этапе, т.к. в V1 содержится не уникальный V2 и не уникальный V3, а уникальны они только если их объединить, то я подумал, что уникальность V2+V3 минус 2 последних значения в V3 мне будет достаточно, чтобы посчитать верно количество идущих подряд V2+V3 в каждом отдельном V1. Ниже код, буду благодарен за любую помощь и комментарии, возможно для моего решения есть совсем простой и элегантный способ получить желаемое. Или, что будет еще лучше...может кто то поделится способом как посчитать количество подряд идущих данных на V1, например на V1, если V2 на котором с такого то V3 по такой то, такое то кол-во подряд идущих данных... voenvuz3 <- read.table("G://badchannel0113.asc") %>% mutate (ffprpk = ((`V1`*10000+`V2`)*10000+`V3`)) %>% mutate(prpkD = ffprpk)%>% select(ffprpk, prpkD, V4) %>% arrange(ffprpk) voenvuz3 A099 <- voenvuz3 %>% mutate_at(-2, ~lead(., 1)) %>% slice(1:(n()-1)) %>% mutate(DIF= ffprpk-prpkD) %>% arrange(ffprpk) A099 This post has been edited by Алекс3212: 15.01.2020 00:05 Attached image(s) 1.png — (13.99k) |
plantago Advanced Member |
И/или кусок исходных данных (не картинкой, а числами) и какие бы данные из них хотелось бы сделать? А то сейчас, я прошу прощения, очень трудно понять, что имеется в виду... |
plantago Advanced Member |
=== > aa <- c(1, 1, 2, 3, 3, 1, 2, 2, 2) > diff(aa) [1] 0 1 1 0 -2 1 0 0 > c(FALSE, diff(aa) == 0) [1] FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE TRUE > rle(aa) Run Length Encoding lengths: int [1:5] 2 1 2 1 3 values : num [1:5] 1 2 3 1 2 === |
Алекс3212 |
(plantago @ 15.01.2020 07:47) А можно просто либо минимальный работающий пример, который можно запустить? И/или кусок исходных данных (не картинкой, а числами) и какие бы данные из них хотелось бы сделать? А то сейчас, я прошу прощения, очень трудно понять, что имеется в виду... Примера нет, честно сказать я сам не представляю до конца как это должно работать...есть только задача...посчитать количество подряд идущих данных...если данных более 10 подряд, отслеживать по времени сколько это длилось (его нет еще в данных, пока проблема определиться как считать подряд). По сути, это контроль за пропущенными данными, V4 хоть и не используется в этом файле, представляет собой список только пропущенных значений выгруженный из сторонней программы. Часть файла прикрепил к сообщению. Посчитать общее количество прощенных значений в записи (т.е. в V1) не проблема, в V1+V2 тоже, но т.к. V1+V2 не даст количество пропусков подряд, это не то, т.к. значения могут быть пропущены не подряд, например через 1 значение...вчера попробовал убрать все таки 2 последних значения в V3 и это тоже не то... Насчет diff и rle спасибо, почитаю подробнее, что это и что дает This post has been edited by Алекс3212: 15.01.2020 12:14 Attached File(s)
|
plantago Advanced Member |
=== 33283.000 7913.000 1904.000 33283.000 7913.000 1905.000 33283.000 7913.000 1906.000 33283.000 7913.000 1907.000 33283.000 7913.000 1908.000 33283.000 7913.000 1909.000 33283.000 7913.000 1910.000 33283.000 7913.000 1911.000 33283.000 7913.000 1912.000 33284.000 7577.000 1522.000 33284.000 7593.000 1290.000 33284.000 7593.000 1291.000 33284.000 7593.000 1313.000 33284.000 7593.000 1328.000 33284.000 7593.000 1341.000 33284.000 7737.000 1576.000 33284.000 7817.000 1696.000 33284.000 7849.000 1751.000 33284.000 7897.000 1724.000 33284.000 7897.000 1725.000 33284.000 7897.000 1737.000 33284.000 7897.000 1742.000 33284.000 7897.000 1763.000 33284.000 7897.000 1766.000 33284.000 7897.000 1769.000 33284.000 7897.000 1770.000 33284.000 7897.000 1771.000 33284.000 7897.000 1772.000 33284.000 7897.000 1773.000 === Напишите, как должен выглядеть результат. |
Алекс3212 |
(plantago @ 15.01.2020 08:24) ... но вообще-то для того, чтобы найти идущие подряд значения, лучше всего запустить diff() или rle(): === > aa <- c(1, 1, 2, 3, 3, 1, 2, 2, 2) > diff(aa) [1] 0 1 1 0 -2 1 0 0 > c(FALSE, diff(aa) == 0) [1] FALSE TRUE FALSE FALSE TRUE FALSE FALSE TRUE TRUE > rle(aa) Run Length Encoding lengths: int [1:5] 2 1 2 1 3 values : num [1:5] 1 2 3 1 2 === Мне нравится как работает diff (то, что он делает) , я могу заменить им целых 2 строки кода со смещением, ато и больше...но как мне сделать, чтобы он возвращал не вектор, а информация находилась в столбце, чтобы прикрутить это к таблице где есть V1, V2, V3 ? Attached image(s) 1.png — (34.01k) |
plantago Advanced Member |
|
Алекс3212 |
(plantago @ 15.01.2020 15:30) Хорошо. Вот кусок Ваших данных, первые три колонки: === 33283.000 7913.000 1904.000 33283.000 7913.000 1905.000 33283.000 7913.000 1906.000 33283.000 7913.000 1907.000 33283.000 7913.000 1908.000 33283.000 7913.000 1909.000 33283.000 7913.000 1910.000 33283.000 7913.000 1911.000 33283.000 7913.000 1912.000 33284.000 7577.000 1522.000 33284.000 7593.000 1290.000 33284.000 7593.000 1291.000 33284.000 7593.000 1313.000 33284.000 7593.000 1328.000 33284.000 7593.000 1341.000 33284.000 7737.000 1576.000 33284.000 7817.000 1696.000 33284.000 7849.000 1751.000 33284.000 7897.000 1724.000 33284.000 7897.000 1725.000 33284.000 7897.000 1737.000 33284.000 7897.000 1742.000 33284.000 7897.000 1763.000 33284.000 7897.000 1766.000 33284.000 7897.000 1769.000 33284.000 7897.000 1770.000 33284.000 7897.000 1771.000 33284.000 7897.000 1772.000 33284.000 7897.000 1773.000 === Напишите, как должен выглядеть результат. Не просто это конечно...но возможно как то так...увидел это на одном сайте, но там под мою задачу не пойдет код, а как пример результата возможно... CODE df_out City count 1 Mexico 1:2 2 London 0:1 3 London 1:2 если на моем примере то как то так: 33283 7913 x 33283 7577 x 33284 7897 x и тд., где x это количество данных V3 идущих подряд...чтобы я понимал, не редкостью в моих данных в таком случае будет ситуация, когда будет вот так: 33283 7913 x 33283 7913 x 33283 7913 x Потому что один V2 (в примере выше 7913) может содержать в разных местах несколько участков V3 в которых данные идут подряд.
|
PS2004R Advanced Member |
> read.table("data.txt") V1 V2 V3 1 33283 7913 1904 2 33283 7913 1905 3 33283 7913 1906 4 33283 7913 1907 5 33283 7913 1908 6 33283 7913 1909 7 33283 7913 1910 8 33283 7913 1911 9 33283 7913 1912 10 33284 7577 1522 11 33284 7593 1290 12 33284 7593 1291 13 33284 7593 1313 14 33284 7593 1328 15 33284 7593 1341 16 33284 7737 1576 17 33284 7817 1696 18 33284 7849 1751 19 33284 7897 1724 20 33284 7897 1725 21 33284 7897 1737 22 33284 7897 1742 23 33284 7897 1763 24 33284 7897 1766 25 33284 7897 1769 26 33284 7897 1770 27 33284 7897 1771 28 33284 7897 1772 29 33284 7897 1773 > d <- read.table("data.txt") > paste(d[,1], d[,2]) [1] "33283 7913" "33283 7913" "33283 7913" "33283 7913" "33283 7913" [6] "33283 7913" "33283 7913" "33283 7913" "33283 7913" "33284 7577" [11] "33284 7593" "33284 7593" "33284 7593" "33284 7593" "33284 7593" [16] "33284 7737" "33284 7817" "33284 7849" "33284 7897" "33284 7897" [21] "33284 7897" "33284 7897" "33284 7897" "33284 7897" "33284 7897" [26] "33284 7897" "33284 7897" "33284 7897" "33284 7897" > rle(paste(d[,1], d[,2])) Run Length Encoding lengths: int [1:7] 9 1 5 1 1 1 11 values : chr [1:7] "33283 7913" "33284 7577" "33284 7593" "33284 7737" "33284 7817" ... > res <- rle(paste(d[,1], d[,2])) > str(res) List of 2 $ lengths: int [1:7] 9 1 5 1 1 1 11 $ values : chr [1:7] "33283 7913" "33284 7577" "33284 7593" "33284 7737" ... - attr(*, "class")= chr "rle" > data.frame(do.call(rbind, strsplit(res$values," ")),x=res$lengths) X1 X2 x 1 33283 7913 9 2 33284 7577 1 3 33284 7593 5 4 33284 7737 1 5 33284 7817 1 6 33284 7849 1 7 33284 7897 11 >
|
Алекс3212 |
(PS2004R @ 16.01.2020 01:11) Уверен это работает, завтра попробую днем. Спасибо огромное вам))) Сам бы я не догадался) |
plantago Advanced Member |
|
Алекс3212 |
(PS2004R @ 16.01.2020 01:11) Я поспешил с выводами, к сожалению, это не работает...во всяком случае как хотелось бы... используя этот код я получаю общее количество в Х2, а не только тех которые идут подряд. С помощью кода действительно можно посчитать сумму каналов, в связке Х1+Х2... Такого результата я добился уже ранее с помощью вот такого кода, где д это таже таблица из вашего примера: d1 <- d %>% select(V1, V2, V3) %>% mutate(mea = (V1*10000+V2)) %>% group_by(mea) %>% summarise(n = n()) d1 mea n 1 332837913 9 2 332847577 1 3 332847593 5 4 332847737 1 5 332847817 1 6 332847849 1 7 332847897 11 Но я узнал, что то новое для себя, поэтому все равно спасибо) Но вопрос не решен This post has been edited by Алекс3212: 16.01.2020 14:32 Attached image(s) 1.png — (26.65k) |
Алекс3212 |
(Алекс3212 @ 16.01.2020 15:28) Я поспешил с выводами, к сожалению, это не работает...во всяком случае как хотелось бы... используя этот код я получаю общее количество в Х2, а не только тех которые идут подряд. С помощью кода действительно можно посчитать сумму каналов, в связке Х1+Х2... Такого результата я добился уже ранее с помощью вот такого кода, где д это таже таблица из вашего примера: Но я узнал, что то новое для себя, поэтому все равно спасибо) Но вопрос не решен Пример почти работающего кода я могу привести еще раз, но я не уверен что я пошел в ту сторону, так как я в тупик попал... d <- read.table("data.txt") voenvuz1 <- d %>% mutate (ffprpk = ((`V1`*10000+`V2`)*10000+`V3`)) %>% mutate(prpkD = ffprpk)%>% select(ffprpk, prpkD) %>% arrange(ffprpk) voenvuz1 A099 <- voenvuz1 %>% mutate_at(-2, ~lead(., 1)) %>% slice(1:(n()-1)) %>% mutate(V4 = 0) %>% mutate(DIF= ffprpk-prpkD) %>% arrange(ffprpk) A099 Данный код позволяет идентифицировать подряд идущие данные в V3, пишет 1 в столбец DIF если данные идут по порядку, если порядок прерывается значения отличаются от 1 цы. где "data.txt" это V1 <dbl> V2 <dbl> V3 <dbl> 1 33283 7913 1904 2 33283 7913 1905 3 33283 7913 1906 4 33283 7913 1907 5 33283 7913 1908 6 33283 7913 1909 7 33283 7913 1910 8 33283 7913 1911 9 33283 7913 1912 10 33284 7577 1522 11 33284 7593 1290 12 33284 7593 1291 13 33284 7593 1313 14 33284 7593 1328 15 33284 7593 1341 16 33284 7737 1576 17 33284 7817 1696 18 33284 7849 1751 19 33284 7897 1724 20 33284 7897 1725 21 33284 7897 1737 22 33284 7897 1742 23 33284 7897 1763 24 33284 7897 1766 25 33284 7897 1769 26 33284 7897 1770 27 33284 7897 1771 28 33284 7897 1772 29 33284 7897 1773 30 77225 7897 1773 31 77225 7897 1774 32 77225 7897 1775 33 77225 7897 1778 34 77225 7897 1880 35 77225 7897 1881 36 77225 7897 1882 36 rows так же приложил к письму фаил Мне нужно получить следующее: This post has been edited by Алекс3212: 16.01.2020 19:38 Attached image(s) Image.png — (9.16k) Image1.png — (9.78k) Attached File(s)
|
plantago Advanced Member |
|
PS2004R Advanced Member |
(Алекс3212 @ 16.01.2020 14:28) Я поспешил с выводами, к сожалению, это не работает...во всяком случае как хотелось бы... используя этот код я получаю общее количество в Х2, а не только тех которые идут подряд. С помощью кода действительно можно посчитать сумму каналов, в связке Х1+Х2... Такого результата я добился уже ранее с помощью вот такого кода, где д это таже таблица из вашего примера: Но я узнал, что то новое для себя, поэтому все равно спасибо) Но вопрос не решен Не понятно совершенно что нужно. Attached image(s) post_1125819_1579174078.png — (40.08k) |
Алекс3212 |
(plantago @ 16.01.2020 20:08) Да все верно..они повторяются 7 раз подряд, но там есть так же третье значение, которое если сделать одним значением V1 (77225) c V2 (7897) с V3, получится уникальное значение... Повторяется V1, V2 и V3 если их смотреть поодиночке, повторяется V1+V2, V1+V2+V3 уникальное значение, которое не повторяется, вот мне и нужно посчитать количество подряд идущих этих уникальных значений. И да... в повторяемом V1 содержатся данные повторяемых V2 в которых содержатся повторяемые (если брать только V3 сам по себе без V1+V2+V3) данные: чтобы уйти от чисел попборую привести пример как выглядят данные и что мне нужно иначе: исходные данные X1 X2 X3 Иванов Петр 12 (например время приема лекарства) Иванов Петр 11 Иванов Саша 12 Сидоров Саша 2 Иванов Глеб 5 Сидоров Саша 8 Иванов Глеб 6 Иванов Глеб 10 Сидоров Саша 1 Иванов Глеб 11 Где в мое представлении я получаю, что: Иванов Петр 2 (столько часов подряд принимал лекарство) Иванов Саша 0 (а этот лекарство принимал, но не подряд) Сидоров Саша 2 (тоже принимал 2 часа подряд лекарство) Иванов Глеб 2 (принял 2 часа подряд) Иванов Глеб 2 ( и снова принял 2 часа подряд) С той лишь разницей, что таким сидоровых и ивановых 3 тысячи и имя тоже меняется очень часто, а интересуют меня только сколько они подряд часов принимали лекарство, не сумма, не количество, а именно периодичность подряд или не подряд. |
Алекс3212 |
(PS2004R @ 16.01.2020 20:49) Да извиниюсь, не подписал...я выделил эти данные, чтобы показать, что в них последний столбец не содержит значения подряд, тем не менее, они участвовали в расчете количества, т.е. получилось количество всех x и подряд и не подряд в X1+X2 |
PS2004R Advanced Member |
(Алекс3212 @ 16.01.2020 20:04) Да извиниюсь, не подписал...я выделил эти данные, чтобы показать, что в них последний столбец не содержит значения подряд, тем не менее, они участвовали в расчете количества, т.е. получилось количество всех x и подряд и не подряд в X1+X2 > delta <- diff(d[,3]) > delta[which(delta==1)+1] <- 1 > data.frame(d, delta) V1 V2 V3 delta 1 33283 7913 1904 1 2 33283 7913 1905 1 3 33283 7913 1906 1 4 33283 7913 1907 1 5 33283 7913 1908 1 6 33283 7913 1909 1 7 33283 7913 1910 1 8 33283 7913 1911 1 9 33283 7913 1912 1 10 33284 7577 1522 -232 11 33284 7593 1290 1 12 33284 7593 1291 1 13 33284 7593 1313 15 14 33284 7593 1328 13 15 33284 7593 1341 235 16 33284 7737 1576 120 17 33284 7817 1696 55 18 33284 7849 1751 -27 19 33284 7897 1724 1 20 33284 7897 1725 1 21 33284 7897 1737 5 22 33284 7897 1742 21 23 33284 7897 1763 3 24 33284 7897 1766 3 25 33284 7897 1769 1 26 33284 7897 1770 1 27 33284 7897 1771 1 28 33284 7897 1772 1 29 33284 7897 1773 1 > delta[which(!(delta==1))] <- 0 > data.frame(d, delta) V1 V2 V3 delta 1 33283 7913 1904 1 2 33283 7913 1905 1 3 33283 7913 1906 1 4 33283 7913 1907 1 5 33283 7913 1908 1 6 33283 7913 1909 1 7 33283 7913 1910 1 8 33283 7913 1911 1 9 33283 7913 1912 1 10 33284 7577 1522 0 11 33284 7593 1290 1 12 33284 7593 1291 1 13 33284 7593 1313 0 14 33284 7593 1328 0 15 33284 7593 1341 0 16 33284 7737 1576 0 17 33284 7817 1696 0 18 33284 7849 1751 0 19 33284 7897 1724 1 20 33284 7897 1725 1 21 33284 7897 1737 0 22 33284 7897 1742 0 23 33284 7897 1763 0 24 33284 7897 1766 0 25 33284 7897 1769 1 26 33284 7897 1770 1 27 33284 7897 1771 1 28 33284 7897 1772 1 29 33284 7897 1773 1 > d <- data.frame(d, delta) > res <- rle(paste(d[,1], d[,2], d[,4])) > data.frame(do.call(rbind, strsplit(res$values," ")),x=res$lengths) X1 X2 X3 x 1 33283 7913 1 9 2 33284 7577 0 1 3 33284 7593 1 2 4 33284 7593 0 3 5 33284 7737 0 1 6 33284 7817 0 1 7 33284 7849 0 1 8 33284 7897 1 2 9 33284 7897 0 4 10 33284 7897 1 5
|
Алекс3212 |
(PS2004R @ 16.01.2020 22:03) Это отлично работает на представленных данных из data.txt, спасибо) Буду разбираться теперь, что там происходит за волшебство и применять к своим исходным данным. Вопрос решен) P.S. почему-то разное количество строк в delta и в d, поэтому объединить их в data.frame пишет что нельзя вот код d <- read.table("E:/bad.txt") %>% mutate(prpk = (V1*10000+V2)*10000+V3) %>% arrange(prpk) %>% select(V1, V2, V3) d delta <- diff(d[,3]) delta[which(delta==1)+1] <- 1 data.frame(d, delta) вот результат Error in data.frame(d, delta) : аргументы подразумевают разные количества строк: 15, 14 вот исходник сокращенный до 15 строк This post has been edited by Алекс3212: 17.01.2020 14:34 Attached image(s) 11.png — (3.49k) 12.png — (11.67k) Attached File(s)
|
plantago Advanced Member |
> diff(1:3) [1] 1 1 Добавьте и будет Вам счастье
|
PS2004R Advanced Member |
(plantago @ 17.01.2020 15:33) А, там наверное забыто, что надо в начало добавить один элемент, потому что diff() всегда будет короче чем тот объект из которого он получен. Например, > diff(1:3) [1] 1 1 Добавьте и будет Вам счастье нет в конец 0 надо конкатенировать и далее как и прежде (данные на 1 кончались в первом примере) delta <- с(diff(d[,3]), 0) This post has been edited by PS2004R: 17.01.2020 15:48
|
Алекс3212 |
(PS2004R @ 17.01.2020 16:45) нет в конец 0 надо конкатенировать и далее как и прежде (данные на 1 кончались в первом примере) delta <- с(diff(d[,3]), 0) Да, теперь работает, спасибо за помощь!!!!!!!!!!! |
Алекс3212 |
(plantago @ 17.01.2020 16:33) А, там наверное забыто, что надо в начало добавить один элемент, потому что diff() всегда будет короче чем тот объект из которого он получен. Например, > diff(1:3) [1] 1 1 Добавьте и будет Вам счастье А можно еще как то поменять код, Чтобы он считал количество участков с X 3, которые идут подряд, а не сумму количества повторов на X2. например когда 1111 2222 2222 1111 2222 2223 1111 2222 1111 1111 2222 1112 код выше посчитает 1111 2222 4 можно ли сделать чтобы было 1111 2222 2 1111 2222 2 И еще вопрос, как сделать замену в строке, например если есть в столбце X2 2222 как заменить это например на цифру 1 или текст loft, по аналогии с эксель "найти-вставить"? |
PS2004R Advanced Member |
(Алекс3212 @ 23.01.2020 13:01) А можно еще как то поменять код, Чтобы он считал количество участков с X 3, которые идут подряд, а не сумму количества повторов на X2. например когда 1111 2222 2222 1111 2222 2223 1111 2222 1111 1111 2222 1112 код выше посчитает 1111 2222 4 можно ли сделать чтобы было 1111 2222 2 1111 2222 2 И еще вопрос, как сделать замену в строке, например если есть в столбце X2 2222 как заменить это например на цифру 1 или текст loft, по аналогии с эксель "найти-вставить"? Это элементарно CODE > d <- read.table("data.txt") > d V1 V2 V3 1 1111 2222 2222 2 1111 2222 2223 3 1111 2222 1111 4 1111 2222 1112 > delta <- c(diff(d[,3]), 0) > delta [1] 1 -1112 1 0 > s <- which(!(delta == 1)) > s [1] 2 4 > delta[which(delta==1)+1] <- 1 > delta [1] 1 1 1 1 > delta[which(!(delta==1))] <- 0 > sec <- rep(1:(length(s)), + times=Reduce(function(x1,x2) x2-x1, s, accumulate=T)) > d <- data.frame(d, delta, sec) > res <- rle(paste(d[,1], d[,2], d[,4], d[,5])) > data.frame(do.call(rbind, strsplit(res$values," ")),x=res$lengths) X1 X2 X3 X4 x 1 1111 2222 1 1 2 2 1111 2222 1 2 2
|
Алекс3212 |
(PS2004R @ 23.01.2020 14:52) Это элементарно CODE > d <- read.table("data.txt") > d V1 V2 V3 1 1111 2222 2222 2 1111 2222 2223 3 1111 2222 1111 4 1111 2222 1112 > delta <- c(diff(d[,3]), 0) > delta [1] 1 -1112 1 0 > s <- which(!(delta == 1)) > s [1] 2 4 > delta[which(delta==1)+1] <- 1 > delta [1] 1 1 1 1 > delta[which(!(delta==1))] <- 0 > sec <- rep(1:(length(s)), + times=Reduce(function(x1,x2) x2-x1, s, accumulate=T)) > d <- data.frame(d, delta, sec) > res <- rle(paste(d[,1], d[,2], d[,4], d[,5])) > data.frame(do.call(rbind, strsplit(res$values," ")),x=res$lengths) X1 X2 X3 X4 x 1 1111 2222 1 1 2 2 1111 2222 1 2 2 Error: unexpected '=' in: "sec <- rep(1:(length(s)), + times =" ошибку пишет вроде..попробовал убрать знак +, выполнилось, но на след шаге тогда ошибка Error in data.frame(d, delta, sec) : аргументы подразумевают разные количества строк: 16280, 18256353 This post has been edited by Алекс3212: 23.01.2020 19:58 |
PS2004R Advanced Member |
(Алекс3212 @ 23.01.2020 19:53) ошибку пишет вроде..попробовал убрать знак +, выполнилось, но на след шаге тогда ошибка Error in data.frame(d, delta, sec) : аргументы подразумевают разные количества строк: 16280, 18256353 да, тут надо эту строку так поправить: CODE sec <- rep(1:(length(s)), times=c(s[1],diff(s))) надеюсь теперь всё?
|
Алекс3212 |
(PS2004R @ 23.01.2020 22:59) да, тут надо эту строку так поправить: CODE sec <- rep(1:(length(s)), times=c(s[1],diff(s))) надеюсь теперь всё? Да, спасибо, все отлично)! |
Алекс3212 |
(PS2004R @ 23.01.2020 22:59) да, тут надо эту строку так поправить: CODE sec <- rep(1:(length(s)), times=c(s[1],diff(s))) надеюсь теперь всё? Можете посоветовать литературу, желательно на русском, но и на английском норм, по той теме, что происходит с представленном вами коде, или источник в интернете? Через поиск гугл по поиску "which in r" мало что находит, хочу разобраться что за волшебство происходит в коде, чтобы каждый раз не беспокоить своими вопросами форумчан) |
PS2004R Advanced Member |
(Алекс3212 @ 24.01.2020 23:46) Можете посоветовать литературу, желательно на русском, но и на английском норм, по той теме, что происходит с представленном вами коде, или источник в интернете? Через поиск гугл по поиску "which in r" мало что находит, хочу разобраться что за волшебство происходит в коде, чтобы каждый раз не беспокоить своими вопросами форумчан) 1. В R нет "скаляров", есть только "векторы-тензоры". Это налагает определенные обязательства на пишущего код. На мой взгляд надо повысить ставки и сразу почитать что то вот такое Это введение в язык векторных вычислений который (вернее его более древняя версия) до R использовался датааналитиками. Там сразу пример собственно, как ломать мозг от "я умею на любом языке программировать как на фортране" до "я умею в векторные вычисления и мне нужны явно написанные циклы только когда нужен побочный эффект". Но у R крайне слабые на самом деле возможности "в вектора", и далее нужно посмотреть (возможно несколько раз) видео лекции по SICP (этого полностью достаточно, читать книгу не надо). Дело в том что R это просто еще одна Схема и все что можно программировать в Схеме, можно программировать и в R (даже вектора, это всего навсего DSL написанные поверх схемы по заветам курса SICP). А совсем начать надо с "Введения в R" которое прямо на CRAN лежит. 2. В R важно (для успешного "идеоматического" программинга) прочитать-просмотреть те функции что накоплены в {base}. Это позволяет не писать с ноля "велосипеды", поскольку за 30 лет там есть практически все что могло понадобиться сколько нибудь часто. Найденные "кубики" надо прикинуть как комбинировать друг с другом.
|
plantago Advanced Member |
|
d-taras |
Как он делается я знаю. Но у меня данные по каждому периоду наблюдения находятся в отдельной таблице. Заголовок типа CODE X,Y, NDVI Как сформировать дополнительною колонку "month" для таблицы, где в каждой строчке будет стоять название одного и того же месяца? Т.е. CODE X,Y, NDVI, month И как сформировать из всех таблиц общую по двум колонкам? Т.е. CODE NDVI, month
0.2, 4 n, 4 0.5, 5 0.6, 6 |
plantago Advanced Member |
|
Guest IP-stamp: frLlk1iUohrRs guest |
|
plantago Advanced Member |
Но зачем Вам для удаления слова отдельный пакет? Все это можно сделать в базовом R: > s1 <- "This is a pen" > s2 <- "This is a cat" > gsub("^This ", "", s1) [1] "is a pen" > gsub("^This ", "", s2) [1] "is a cat" |
a IP-stamp: frkUc/3HMUCQQ guest |
(plantago @ 11.03.2020 04:10) В принципе, Вам сюда: Но зачем Вам для удаления слова отдельный пакет? Все это можно сделать в базовом R: > s1 <- "This is a pen" > s2 <- "This is a cat" > gsub("^This ", "", s1) [1] "is a pen" > gsub("^This ", "", s2) [1] "is a cat" А если другая задача? Есть список слов которые надо оставить, а все остальное удалить, перечислять слова которые удалить надо не выход..какой тогда будет код?) |
PS2004R Advanced Member |
(a @ 12.03.2020 20:30) А если другая задача? Есть список слов которые надо оставить, а все остальное удалить, перечислять слова которые удалить надо не выход..какой тогда будет код?) ну вот так например, CODE > strsplit("один два", " ")[[1]] %in% c("один", "два", "три") [1] TRUE TRUE PS но вам конечно было лень свой пример постить сразу, но вот возражения (и время на их доведения) уверен найдутся
|
Guest IP-stamp: frLlk1iUohrRs guest |
(PS2004R @ 12.03.2020 23:06) ну вот так например, CODE > strsplit("один два", " ")[[1]] %in% c("один", "два", "три") [1] TRUE TRUE PS но вам конечно было лень свой пример постить сразу, но вот возражения (и время на их доведения) уверен найдутся Спасибо, нет возражений нет. Я согласен, что пакетом base можно сделать очень многое, только вот одна проблема...если изучаешь r сам и как не профессионал, в условиях когда мануал есть только на английском и только встроенный в help довольно сложно использовать этот пакет и его возможности! Не встречал не одного документа или сайта, где есть методичка/мануал к пакету base на русском... в отличии от других не встроенных пакетов в r. Хотя казалось бы, самый главный и важный пакет, а никто детально не разжевал на русском все возможности) Вот и приходится мне по крайней мере, искать другие пути |
plantago Advanced Member |
Память R Документация Память, доступная для хранения данных Описание Как R управляет своим рабочим пространством. Детали R имеет рабочее пространство переменного размера. Существуют (редко используемые) параметры командной строки для управления ее минимальным размером, но больше нет возможности контролировать максимальный размер. R поддерживает отдельные области для объектов фиксированного и переменного размера. Первый из них выделяется как массив cons-ячеек...
|
PS2004R Advanced Member |
(Guest @ 15.03.2020 18:24) Хотя казалось бы, самый главный и важный пакет, а никто детально не разжевал на русском все возможности) Перевод как уже показали способ проблем не составляет. Что касается использования функций из {base} то ведь и в других языках никто не может "написать как на них собственно программировать". То же "голый синтаксис". Вот fortran который интегрируется в R. Нигде ведь явно не написано, что делая рекусрсивный call mysubr(a, b, c) надо именно в "а, b, c" заранее положить инкременты значений, а после вызова не забыть возвращаемое значение (пусть это будет "c") положить к накапливаемому результату? Но вот нигде так код не "разжевывают". Это всегда в виде задач и упражнений. Ну еще примеры приводят, но потом обязательно упражнения (причем не тривиальные). В Как с любым языком который изучаешь что бы выражать на нем свои мысли (тут даже больше аналогия с естественным языком ) 1. Надо прорешать букварь "Введение в R" (подождать пару недель и опять прорешать) 2. Просмотреть {base} и прикинуть где эти кубики можно приткнуть в повседневные задачи 3. Посмотреть лекции SICP про Схему, из которой и получилась текущая реализация R.
|
plantago Advanced Member |
=== О, оказывается она переиздана в CRC Press 2018 году! |
PS2004R Advanced Member |
(plantago @ 17.03.2020 09:02) С другой стороны, есть такая проблема -- мало руководств по языку как таковому и базовым функциям, по типу "голубой книги" (Becker et al. 1986. The new S language). Кстати, она до сих пор актуальна (цитируется почти везде в R help), и отлично читается. === О, оказывается она переиздана в CRC Press 2018 году! Приемы именно программирования хорошо смотреть в вот таких примерах-исследованиях
|
plantago Advanced Member |
|
Алекс3212 |
(PS2004R @ 23.01.2020 14:52) Это элементарно CODE > d <- read.table("data.txt") > d V1 V2 V3 1 1111 2222 2222 2 1111 2222 2223 3 1111 2222 1111 4 1111 2222 1112 > delta <- c(diff(d[,3]), 0) > delta [1] 1 -1112 1 0 > s <- which(!(delta == 1)) > s [1] 2 4 > delta[which(delta==1)+1] <- 1 > delta [1] 1 1 1 1 > delta[which(!(delta==1))] <- 0 > sec <- rep(1:(length(s)), + times=Reduce(function(x1,x2) x2-x1, s, accumulate=T)) > d <- data.frame(d, delta, sec) > res <- rle(paste(d[,1], d[,2], d[,4], d[,5])) > data.frame(do.call(rbind, strsplit(res$values," ")),x=res$lengths) X1 X2 X3 X4 x 1 1111 2222 1 1 2 2 1111 2222 1 2 2 Добрый вечер, я снова к вам за советом... подскажите какие команды использовать, чтобы в этой замечательной таблице, что вы подсказали мне как сделать, добавить еще 2 столбца, а именно минимально и максимальное значение чтобы в итоге получилось вот так: X1 X2 X3 X4 x min max 1 1111 2222 1 1 2 1045 1047 2 1111 2222 1 2 2 Понадобилось посчитать разницу в интервалах времени, а не зная точный интервал сложно это сделать корректно будет, время уже получилось посчитать с помощью lubrydate пакета ...ниже код, но вы его увидели естественно. d <- read.table("F:/YN_3D-files/MiscFiles/badchan.asc") %>% mutate(prpk = (V1*10000+V2)*10000+V3) %>% arrange(prpk) %>% select(V1, V2, V3) d delta <- c(diff(d[,3]), 0) delta[which(delta==1)+1] <- 1 data.frame(d, delta) delta[which(!(delta==1))] <- 0 data.frame(d, delta) d <- data.frame(d, delta) res <- rle(paste(d[,1], d[,2], d[,4])) FFF <- data.frame(do.call(rbind, strsplit(res$values," ")),x=res$lengths) получается вот такой результат (красным нарисовал то что хотелось бы видеть еще) не получается картинку прикрепить что то, вот ссылка This post has been edited by plantago: 12.04.2020 09:44 |
plantago Advanced Member |
|
Алекс3212 |
(plantago @ 13.04.2020 20:09) Ну вот я аккуратно Ваш пост дооформил, но, честно сказать, так и не понял, что же Вы хотите. Откуда взялись цифры 1045 и 1047, совершенно непонятно. Может быть, конечно, кто-то поймет, но я сдаюсь. Да я и сам написал, а потом уже понял, что сам бы не понял, что нужно на месте другого человека....извиняюсь. исходный файл вот такой > d <- read.table("data.txt") > d V1 V2 V3 1 1111 2222 2222 2 1111 2222 2223 3 1111 2222 1111 4 1111 2222 1112 Те значения что нужны min и max содержатся в V3, проблема (для меня пока что), в том, что этот столбец удаляется (оно и ясно иначе не выйдет) для получения файла такого вида X1 X2 X3 X4 x 1 1111 2222 1 1 2 2 1111 2222 1 2 2 Если на реальном примере и используя код который в моем сообщении был то исходник такой V1 <int> V2 <int> V3 <int> delta <dbl> 170509 5337 1545 1 170509 5337 1546 1 170509 5337 1547 1 170509 5337 1548 1 170509 5337 1549 1 Отлично считается количество файлов, которые идут подряд, но V3 столбец исчезает, а именно там содержатся файлы, которые нужны теперь(( min и max значение. И получается фрейм такого вида X1 <fctr> X2 <fctr> X3 <fctr> x <int> 170509 5337 1 160 170509 5385 0 1 170509 5401 1 5 А нужно, чтобы был примерно следующий 170509 5337 1 160 1545 1705 170509 5385 0 1 5385 5385 170509 5401 1 5 5401 5406 т.е. последние 2 столбца это значения минимум и максимум того что суммируется...пока не придумал, как сделать то что нужно мне, но в голове представляется пока прям огромный путь с манипуляцией данными, т.к. придется это делать с использованием каких то пакетов и использовать какие то ухищрения, кажется мне, что с помощью base пакета можно сделать все в пару строчек, но я его плохо знаю, от чего и такой вопрос)) обещаю выложить код с садомазо ухищрениями как придумаю, но не уверен что кому то нужен будет он, повторюсь, мне кажется там будет пару десятков строк. Поэтому буду рад за любую инфу, пусть не готовый код а просто куда копать)) |
« Next Oldest · Biophysics and math-methods in biology · Next Newest » |