#r #dataframe #vector
#r #фрейм данных #вектор
Вопрос:
Мне интересно, как правильно выполнить векторное вычисление в R.
У меня есть набор данных, подобный этому.
stay cops graduation
hinshi_#0 54722 6945 83674
hinshi_#1 13928 1798 21616
hinshi_#2 320 49 485
hinshi_#3 36010 4984 55184
hinshi_#4 7484 916 10618
hinshi_#5 6 0 6
hinshi_#6 6605 830 9741
hinshi_#7 2 0 5
и у меня тоже есть список l<-c(20124 2682 30138)
.
Что я хочу здесь сделать, так это разделить каждую строку datatable на список.
Позвольте мне выбрать первую строку данных,
hinshi_#0 54722 6945 83674
Я хочу, чтобы они были похожи 54722/20124, 6945/2682, 83764/30138
— вычислить первое значение vector с первым значением списка, то же самое должно произойти со вторым и третьим тоже. Есть хороший способ справиться с этим? Спасибо.
Комментарии:
1. «и у меня есть список l<-c(20124 2682 30138)» Поскольку это недопустимый R-код, не могли бы вы уточнить,
l
это alist
или avector
?2. Я думаю, что самый простой способ сделать это — транспонировать ваши данные, а затем разделить их на вектор. Что-то вроде t (dataset) /l
Ответ №1:
При условии, что я вас правильно понял, вот вариант
l <- c(20124, 2682, 30138)
df / sapply(l, rep, each = nrow(df))
# stay cops graduation
#hinshi_#0 2.719241e 00 2.58948546 2.7763620678
#hinshi_#1 6.921089e-01 0.67039523 0.7172340567
#hinshi_#2 1.590141e-02 0.01826995 0.0160926405
#hinshi_#3 1.789406e 00 1.85831469 1.8310438649
#hinshi_#4 3.718943e-01 0.34153617 0.3523126949
#hinshi_#5 2.981515e-04 0.00000000 0.0001990842
#hinshi_#6 3.282151e-01 0.30947054 0.3232132192
#hinshi_#7 9.938382e-05 0.00000000 0.0001659035
Пример данных
df <- read.table(text =
"stay cops graduation
'hinshi_#0' 54722 6945 83674
'hinshi_#1' 13928 1798 21616
'hinshi_#2' 320 49 485
'hinshi_#3' 36010 4984 55184
'hinshi_#4' 7484 916 10618
'hinshi_#5' 6 0 6
'hinshi_#6' 6605 830 9741
'hinshi_#7' 2 0 5", header = T)
Комментарии:
1. Спасибо! это сработало, но я тоже получил некоторое предупреждение —
1: In FUN(X[[i]], ...) : first element used of 'each' argument
, я знаю, что это просто предупреждение, но мне просто любопытно, что это на самом деле означает. Спасибо!2. @user9191983 Основываясь на приведенных вами примерах данных, это должно выполняться без какого-либо предупреждения.
each
это просто количество ваших строкdata.frame
и является скаляром. Пожалуйста, дважды проверьте свои данные.
Ответ №2:
l
является вектором, как указано (исправлено) в ответе @Maurits Ever. Мы можем использовать purrr
:
as.data.frame(purrr::map2(df,l,function(x,y) x/y))
Результат(может быть отформатирован для удаления научного отображения):
stay cops graduation
1 2.719241e 00 2.58948546 2.7763620678
2 6.921089e-01 0.67039523 0.7172340567
3 1.590141e-02 0.01826995 0.0160926405
4 1.789406e 00 1.85831469 1.8310438649
5 3.718943e-01 0.34153617 0.3523126949
6 2.981515e-04 0.00000000 0.0001990842
7 3.282151e-01 0.30947054 0.3232132192
8 9.938382e-05 0.00000000 0.0001659035
Комментарии:
1. Спасибо! я пытался, но вижу что-то не так here…it похоже, что вычисление выполняется между строкой и столбцами (не строка со строкой), потому что я получил ошибку типа
Error: 'x' (87) and '.y' (3) are different lengths
2. Не могли бы вы показать, какой код вы использовали?! Трудно понять, поскольку я получаю доступ только к набору данных toy.