Rambler's Top100
Лёгкая версия форума* Виртуальная клавиатура  English  
Molbiol.ru | О проекте | Справочник | Методы | Растворы | Расчёты | Литература | Орг.вопросы
Web | Фирмы | Coffee break | Картинки | Работы и услуги | Биржа труда | Междисциплинарный биологический онлайн-журналZbio-wiki

NG SEQUENCING · ЖИЗНЬ РАСТЕНИЙ · БИОХИМИЯ · ГОРОДСКИЕ КОМАРЫ · А.А.ЛЮБИЩЕВ · ЗООМУЗЕЙ


Темы за 24 часа  [ Вход* | Регистрация* ]  
   



Форум: 
 

Щёлкните, чтобы внести в Избранные Темы* R Help -- Давайте составим русский FAQ --
Кураторы темы:* plantago
Операции: Хочу стать куратором* · Подписаться на тему* · Отправить страницу по e-mail · Версия для печати*
Внешний вид:* Схема · [ Стандартный ] · +Перв.сообщ.


Добавить сообщение в темуСоздать новую темуСоздать голосование
Участник оффлайн! PS2004R
Постоянный участник



 прочитанное сообщение 12.10.2019 12:47     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес

(DSV2015 @ 12.10.2019 12:40)
Ссылка на исходное сообщение  PS2004R
C NA в исходном векторе работает хорошо. Но если взять исходный вектор без NA(чтобы не путаться) и прибавлять к x1 не 0.5*x1, а лаг от x1(при сдвиге появляется NA), то не работает.



"Укоротите" индекс по которому обходите ряд соответственно размеру окна. Или пишите код функции учитывая переменную ширину окна.

Это целиком ваше решение, со стороны какое решение будет корректным не видно.
Участник оффлайн! DSV2015




 прочитанное сообщение 12.10.2019 13:15     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(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


Сообщение было отредактировано DSV2015 - 12.10.2019 13:28
Участник оффлайн! PS2004R
Постоянный участник



 прочитанное сообщение 12.10.2019 15:34     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес

(DSV2015 @ 12.10.2019 13:15)
Ссылка на исходное сообщение  
Своя функция работает нормально, возвращает NA.




"Укоротите" индекс по которому обходите ряд соответственно размеру окна. Или пишите код функции учитывая переменную ширину окна.
Участник оффлайн! ПолинаШ
Участник



 прочитанное сообщение 10.11.2019 10:54     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

Есть последовательность типа
"asd",'jjjh", "break", "hasf", "break", "ljs", "kjhh", "nk", "break"
где "break" - терм-разделитель. Необходимо закодировать подпоследовательности,
т.е. сформировать вектор 1, 1, 1, 2, 2, 3, 3, 3, 3
Последовательность может не заканчиваться "break" (он даже вообще может отсутствовать).

Уверена, что есть какая-то готовая опубликованная функция, поэтому очень не хочется заниматься самовязом (тем более, что имею дело с long data). Заранее благодарна за возможные подсказки.
Участник оффлайн! PS2004R
Постоянный участник



 прочитанное сообщение 10.11.2019 12:14     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес

(ПолинаШ @ 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




 прочитанное сообщение 14.01.2020 22:15     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

Добрый день/вечер..Прошу спецов помочь в моей "проблеме", сам я малость застопорился...
Изначально задача у меня была такая:
Есть некоторая таблица из файла 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


Сообщение было отредактировано Алекс3212 - 15.01.2020 00:05

Картинки:
картинка: 1.png
1.png — (13.99к)   

Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 15.01.2020 06:47     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

А можно просто либо минимальный работающий пример, который можно запустить?
И/или кусок исходных данных (не картинкой, а числами) и какие бы данные из них хотелось бы сделать?
А то сейчас, я прошу прощения, очень трудно понять, что имеется в виду...
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 15.01.2020 07:24     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

... но вообще-то для того, чтобы найти идущие подряд значения, лучше всего запустить 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
===
Участник оффлайн! Алекс3212




 прочитанное сообщение 15.01.2020 12:04     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(plantago @ 15.01.2020 07:47)
Ссылка на исходное сообщение  А можно просто либо минимальный работающий пример, который можно запустить?
И/или кусок исходных данных (не картинкой, а числами) и какие бы данные из них хотелось бы сделать?
А то сейчас, я прошу прощения, очень трудно понять, что имеется в виду...


Примера нет, честно сказать я сам не представляю до конца как это должно работать...есть только задача...посчитать количество подряд идущих данных...если данных более 10 подряд, отслеживать по времени сколько это длилось (его нет еще в данных, пока проблема определиться как считать подряд). По сути, это контроль за пропущенными данными, V4 хоть и не используется в этом файле, представляет собой список только пропущенных значений выгруженный из сторонней программы. Часть файла прикрепил к сообщению.
Посчитать общее количество прощенных значений в записи (т.е. в V1) не проблема, в V1+V2 тоже, но т.к. V1+V2 не даст количество пропусков подряд, это не то, т.к. значения могут быть пропущены не подряд, например через 1 значение...вчера попробовал убрать все таки 2 последних значения в V3 и это тоже не то...

Насчет diff и rle спасибо, почитаю подробнее, что это и что дает

Сообщение было отредактировано Алекс3212 - 15.01.2020 12:14

Файл/ы:

скачать файл badchannel0113_.txt
размер: 1.83мб
кол-во скачиваний: 4


Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 15.01.2020 14:30     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

Хорошо. Вот кусок Ваших данных, первые три колонки:

===
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




 прочитанное сообщение 15.01.2020 17:53     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(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 ?

Картинки:
картинка: 1.png
1.png — (34.01к)   

Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 15.01.2020 18:15     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

Пожалуйста, напишите, как должен выглядеть результат, используя тот кусок данных, который я поместил выше. Без этого я не в состоянии Вам ответить.
Участник оффлайн! Алекс3212




 прочитанное сообщение 15.01.2020 20:23     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(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 в которых данные идут подряд.

Всего благодарностей: 1Поблагодарили (1): plantago
Участник оффлайн! PS2004R
Постоянный участник



 прочитанное сообщение Сообщение на английском  16.01.2020 00:11     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес


> 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
>


Всего благодарностей: 2Поблагодарили (2): plantago, Алекс3212
Участник оффлайн! Алекс3212




 прочитанное сообщение 16.01.2020 01:15     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(PS2004R @ 16.01.2020 01:11)
Ссылка на исходное сообщение  


Уверен это работает, завтра попробую днем. Спасибо огромное вам))) Сам бы я не догадался)
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 16.01.2020 04:51     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

Вот и чудно. Мораль отсюда та, что нужен прототип -- числовой пример с желаемым результатом или уже почти готовый код. Без него тут просто не ответят, потому что никто не поймет, что же в сущности Вам нужно.
Участник оффлайн! Алекс3212




 прочитанное сообщение 16.01.2020 14:28     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(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
  



Но я узнал, что то новое для себя, поэтому все равно спасибо) Но вопрос не решен

Сообщение было отредактировано Алекс3212 - 16.01.2020 14:32

Картинки:
картинка: 1.png
1.png — (26.65к)   

Участник оффлайн! Алекс3212




 прочитанное сообщение 16.01.2020 18:43     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(Алекс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

так же приложил к письму фаил

Мне нужно получить следующее:

Сообщение было отредактировано Алекс3212 - 16.01.2020 19:38

Картинки:
картинка: Image.png
Image.png — (9.16к)   

картинка: Image1.png
Image1.png — (9.78к)   



Файл/ы:

скачать файл data.txt
размер: 740 байт
кол-во скачиваний: 4


Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 16.01.2020 19:08     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

В данных у Вас 77225 вместе с 7897 повторяются 7 раз подряд, а Вы почему-то хотите 4 и 3.
Участник оффлайн! PS2004R
Постоянный участник



 прочитанное сообщение 16.01.2020 19:49     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес

(Алекс3212 @ 16.01.2020 14:28)
Ссылка на исходное сообщение  Я поспешил с выводами, к сожалению, это не работает...во всяком случае как хотелось бы... используя этот код я получаю общее количество в Х2, а не только тех которые идут подряд.
С помощью кода действительно можно посчитать сумму каналов, в связке Х1+Х2...
Такого результата я добился уже ранее с помощью вот такого кода, где д это таже таблица из вашего примера:
Но я узнал, что то новое для себя, поэтому все равно спасибо) Но вопрос не решен


Не понятно совершенно что нужно.

Картинки:
картинка: post_1125819_1579174078.png
post_1125819_1579174078.png — (40.08к)   

Участник оффлайн! Алекс3212




 прочитанное сообщение 16.01.2020 19:56     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(plantago @ 16.01.2020 20:08)
Ссылка на исходное сообщение  В данных у Вас 77225 вместе с 7897 повторяются 7 раз подряд, а Вы почему-то хотите 4 и 3.


Да все верно..они повторяются 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




 прочитанное сообщение 16.01.2020 20:04     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(PS2004R @ 16.01.2020 20:49)
Ссылка на исходное сообщение  Не понятно совершенно что нужно.


Да извиниюсь, не подписал...я выделил эти данные, чтобы показать, что в них последний столбец не содержит значения подряд, тем не менее, они участвовали в расчете количества, т.е. получилось количество всех x и подряд и не подряд в X1+X2
Участник оффлайн! PS2004R
Постоянный участник



 прочитанное сообщение 16.01.2020 21:03     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес

(Алекс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


Всего благодарностей: 2Поблагодарили (2): plantago, Алекс3212
Участник оффлайн! Алекс3212




 прочитанное сообщение 17.01.2020 11:57     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(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 строк

Сообщение было отредактировано Алекс3212 - 17.01.2020 14:34

Картинки:
картинка: 11.png
11.png — (3.49к)   

картинка: 12.png
12.png — (11.67к)   



Файл/ы:

скачать файл bad.txt
размер: 2.52к
кол-во скачиваний: 3


Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 17.01.2020 15:33     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

А, там наверное забыто, что надо в начало добавить один элемент, потому что diff() всегда будет короче чем тот объект из которого он получен. Например,

> diff(1:3)
[1] 1 1

Добавьте и будет Вам счастье smile.gif

Всего благодарностей: 1Поблагодарили (1): PS2004R
Участник оффлайн! PS2004R
Постоянный участник



 прочитанное сообщение 17.01.2020 15:45     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес

(plantago @ 17.01.2020 15:33)
Ссылка на исходное сообщение  А, там наверное забыто, что надо в начало добавить один элемент, потому что diff() всегда будет короче чем тот объект из которого он получен. Например,

> diff(1:3)
[1] 1 1

Добавьте и будет Вам счастье smile.gif


нет в конец 0 надо конкатенировать и далее как и прежде (данные на 1 кончались в первом примере)

delta <- с(diff(d[,3]), 0)

Сообщение было отредактировано PS2004R - 17.01.2020 15:48

Всего благодарностей: 1Поблагодарили (1): plantago
Участник оффлайн! Алекс3212




 прочитанное сообщение 17.01.2020 19:57     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(PS2004R @ 17.01.2020 16:45)
Ссылка на исходное сообщение  нет в конец 0 надо конкатенировать и далее как и прежде (данные на 1 кончались в первом примере)

delta <- с(diff(d[,3]), 0)


Да, теперь работает, спасибо за помощь!!!!!!!!!!!
Участник оффлайн! Алекс3212




 прочитанное сообщение 23.01.2020 13:01     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(plantago @ 17.01.2020 16:33)
Ссылка на исходное сообщение  А, там наверное забыто, что надо в начало добавить один элемент, потому что diff() всегда будет короче чем тот объект из которого он получен. Например,

> diff(1:3)
[1] 1 1

Добавьте и будет Вам счастье smile.gif


А можно еще как то поменять код, Чтобы он считал количество участков с 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
Постоянный участник



 прочитанное сообщение 23.01.2020 13:52     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес

(Алекс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



Всего благодарностей: 1Поблагодарили (1): Алекс3212
Участник оффлайн! Алекс3212




 прочитанное сообщение 23.01.2020 19:53     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(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

Сообщение было отредактировано Алекс3212 - 23.01.2020 19:58
Участник оффлайн! PS2004R
Постоянный участник



 прочитанное сообщение 23.01.2020 21:59     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес

(Алекс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)))



надеюсь теперь всё?

Всего благодарностей: 1Поблагодарили (1): Алекс3212
Участник оффлайн! Алекс3212




 прочитанное сообщение 24.01.2020 11:02     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(PS2004R @ 23.01.2020 22:59)
Ссылка на исходное сообщение  да, тут надо эту строку так поправить:

CODE


sec <- rep(1:(length(s)),  times=c(s[1],diff(s)))



надеюсь теперь всё?


Да, спасибо, все отлично)!
Участник оффлайн! Алекс3212




 прочитанное сообщение 24.01.2020 23:46     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

(PS2004R @ 23.01.2020 22:59)
Ссылка на исходное сообщение  да, тут надо эту строку так поправить:

CODE


sec <- rep(1:(length(s)),  times=c(s[1],diff(s)))



надеюсь теперь всё?


Можете посоветовать литературу, желательно на русском, но и на английском норм, по той теме, что происходит с представленном вами коде, или источник в интернете? Через поиск гугл по поиску "which in r" мало что находит, хочу разобраться что за волшебство происходит в коде, чтобы каждый раз не беспокоить своими вопросами форумчан)
Участник оффлайн! PS2004R
Постоянный участник



 прочитанное сообщение 25.01.2020 00:59     Сообщение для модератора  Сообщение для куратора темы       Фотография  Личное письмо  Отправить e-mail  Web-адрес

(Алекс3212 @ 24.01.2020 23:46)
Ссылка на исходное сообщение  Можете посоветовать литературу, желательно на русском, но и на английском норм, по той теме, что происходит с представленном вами коде, или источник в интернете? Через поиск гугл по поиску "which  in r" мало что находит, хочу разобраться что за волшебство происходит в коде, чтобы каждый раз не беспокоить своими вопросами форумчан)



1.

В R нет "скаляров", есть только "векторы-тензоры". Это налагает определенные обязательства на пишущего код.

На мой взгляд надо повысить ставки и сразу почитать что то вот такое https://www.jsoftware.com/help/jforc/cultur...m#_Toc191734290

Это введение в язык векторных вычислений который (вернее его более древняя версия) до R использовался датааналитиками. Там сразу пример собственно, как ломать мозг от "я умею на любом языке программировать как на фортране" до "я умею в векторные вычисления и мне нужны явно написанные циклы только когда нужен побочный эффект".

Но у R крайне слабые на самом деле возможности "в вектора", и далее нужно посмотреть (возможно несколько раз) видео лекции по SICP (этого полностью достаточно, читать книгу не надо). Дело в том что R это просто еще одна Схема и все что можно программировать в Схеме, можно программировать и в R (даже вектора, это всего навсего DSL написанные поверх схемы по заветам курса SICP).

А совсем начать надо с "Введения в R" которое прямо на CRAN лежит.

2.

В R важно (для успешного "идеоматического" программинга) прочитать-просмотреть те функции что накоплены в {base}. Это позволяет не писать с ноля "велосипеды", поскольку за 30 лет там есть практически все что могло понадобиться сколько нибудь часто.

Найденные "кубики" надо прикинуть как комбинировать друг с другом.

Всего благодарностей: 1Поблагодарили (1): plantago
Участник оффлайн! plantago
Постоянный участник



 прочитанное сообщение 25.01.2020 09:31     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail  Web-адрес

Да, самое простое что Вы можете сделать -- открыть помощь по base:: (например, здесь https://stat.ethz.ch/R-manual/R-patched/lib...ml/00Index.html или просто у себя в R) и для каждой команды (ну хорошо, хотя бы для трех четвертей) проделать прилагаемые к ней примеры. Я так делал smile.gif Хорошо бы сделать такое же и с пакетом stat.

Всего благодарностей: 1Поблагодарили (1): PS2004R
Участник оффлайн! d-taras




 прочитанное сообщение 10.02.2020 14:58     Сообщение для модератора  Сообщение для куратора темы       Личное письмо  Отправить e-mail

Конечная цель построить график "ящик с усами+скрипка" (violin plots).
Как он делается я знаю.
Но у меня данные по каждому периоду наблюдения находятся в отдельной таблице. Заголовок типа
CODE
X,Y, NDVI

Как сформировать дополнительною колонку "month" для таблицы, где в каждой строчке будет стоять название одного и того же месяца? Т.е.
CODE
X,Y, NDVI, month

И как сформировать из всех таблиц общую по двум колонкам? Т.е.
CODE
NDVI, month
          0.2,      4
          n,         4
          0.5,      5
          0.6,      6

*




Кнопка "Транслит" перекодирует
текст из транслита в кирилицу.
Правила перекодировки здесь;
текст в квадратных скобках'[]'
не преобразуется.
Имя:

 преобразовывать смайлики · показать смайлики
Назначение кнопок:

   Поблагодарить автора сообщения — поблагодарить автора
   Удалить сообщение — удалить
   Редактировать сообщение — редактировать
   Поместить сообщение в колонку новостей — поместить в колонку новостей
   Цитировать — цитировать сообщение
   не входит в цитирование/входит в цитирование — цитировать несколько
   Отметить СПАМ-сообщение — обозначить спам
   Сообщение для модератора — связь с модератором
   Участник онлайн!/Участник оффлайн! — автор онлайн/оффлайн
   Фотография — фотография автора

   - остальные обозначения -
 
   *
« Предыдущая тема · Биофизика и матметоды в биологии · Следующая тема »
Быстрый ответДобавить сообщение в темуСоздать новую тему

Rambler   molbiol.ru - методы, информация и программы для молекулярных биологов              

 ·  Викимарт - все интернет-магазины в одном месте  ·  Доска объявлений Board.com.ua  · 
--- сервер арендован в компании Hetzner Online, Германия ---
--- администрирование сервера: Intervipnet ---

Хеликон · Диаэм · ИнтерЛабСервис · Beckman Coulter · SkyGen · ОПТЭК · BIOCAD · Евроген · Синтол · БиоЛайн · Sartorius · Химэксперт · СибЭнзим · Tecan · Даниес · НПП "ТРИС" · Биалекса · ФизЛабПрибор · Genotek · АТГ Сервис Ген · Биоген-Аналитика
Ваш форум  ·  redactor@molbiol.ru  ·  реклама  ·  Дата и время: 19.02.20 03:59
Bridged By IpbWiki: Integration Of Invision Power Board and MediaWiki © GlobalSoft