Как мне назначить значения в списке фреймов данных на основе значений из одного фрейма данных? - PullRequest
0 голосов
/ 11 июля 2020

Я пытаюсь автоматизировать некоторые преобразования данных, которые мне обычно приходится выполнять вручную, и не могу найти способ условно использовать значения из одного фрейма данных для присвоения значений списку фреймов данных. Скорее всего, мне понадобится помощь, чтобы прояснить вопрос, поскольку это сложная проблема.

Изменить: У меня есть список фреймов данных и один фрейм данных.

I Я пытаюсь использовать значения START и STOP из второго фрейма данных, чтобы заполнить столбец заголовка списка фреймов данных, так что, когда значение coords для каждого фрейма данных в списке находится между значениями START и STOP второй df, для строки имени файла, которая соответствует имени df в списке, столбец заголовка будет содержать значение из столбца Behavior второго df.

список фреймов данных:

x <- structure(list(coords = floor(runif(10, min=1, max=40000)), theta = structure(c(13.8547966870419, 
14.8993688012215, 15.410646113828, 15.6703175237307, 14.5498945559588, 
14.8328448615362, 11.9767208496214, 13.4072260529856, 13.9396600622978, 
15.0786802028324), .Dim = c(10L, 1L), .Dimnames = list(NULL, 
    NULL)), heading = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA
)), row.names = c("1", "2", "3", "4", "5", "6", "7", "8", "9", 
"10"), class = "data.frame")
y <- structure(list(coords = floor(runif(10, min=1, max=40000)), theta = structure(c(81.0558787122676, 
80.2691170551245, 79.7678190293645, 79.9335529048482, 80.8203989004178, 
80.5388456375162, 80.6148099805207, 80.9577690561259, 81.9290502290329, 
81.955111593859), .Dim = c(10L, 1L), .Dimnames = list(NULL, NULL)), 
    heading = c(NA, NA, NA, NA, NA, NA, NA, NA, NA, NA)), row.names = c("1", 
"2", "3", "4", "5", "6", "7", "8", "9", "10"), class = "data.frame")
list1 <- list(x,y)
names(list1)<-c("K8121319_feed3_01","K8121319_feed3_02")

одиночный фрейм данных:

structure(list(X = 1:20, File = c("K8121319_feed3_01", "K8121319_feed3_01", 
"K8121319_feed3_01", "K8121319_feed3_01", "K8121319_feed3_01", 
"K8121319_feed3_02", "K8121319_feed3_02", "K8121319_feed3_02", 
"K8121319_feed3_02", "K8121319_feed3_02", "K8121319_feed3_02", 
"K8121319_feed3_02", "K8121319_feed3_03", "K8121319_feed3_03", 
"K8121319_feed3_03", "K8121319_feed3_03", "K8121319_feed3_03", 
"K8121319_feed3_03", "K8121319_feed3_03", "K8121319_feed3_03"
), Behavior = c("Approach", "OutofFrame", "Approach", "Avoid", 
"Explore", "Approach", "Avoid", "Approach", "Avoid", "Approach", 
"OutofFrame", "Approach", "Avoid", "Explore", "Approach", "Avoid", 
"Approach", "Avoid", "Approach", "Avoid"), id = c(1L, 2L, 3L, 
4L, 5L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 
8L), START = c(0, 23554.2374, 26476.1594, 27898.7844, 30744.0344, 
0, 1788.0749, 3989.3999, 17529.5553, 21696.3191, 26503.1743, 
27836.4285, 0, 4472.4934, 27347.0455, 41267.0268, 42172.5351, 
42471.8554, 43926.1675, 44301.1415), STOP = c(23554.1775, 25517.5797, 
27898.7245, 30743.9745, 44719.9623, 1788.015, 3989.34, 17529.4954, 
21696.2592, 26503.1144, 27836.3686, 44297.3079, 4472.4335, 27346.9856, 
41266.9669, 42172.4752, 42471.7955, 43926.1076, 44301.0816, 45116.0211
), duration = c(393.225, 32.777, 23.749, 47.499, 233.321, 29.85, 
36.749, 226.045, 69.561, 80.247, 22.257, 274.806, 74.665, 381.878, 
232.386, 15.116, 4.99599999999998, 24.2779999999999, 6.2589999999999, 
13.6039999999999)), row.names = c(NA, 20L), class = "data.frame")

Исходный вопрос / данные

По сути, у меня есть список фреймов данных, которые все имеют эту общую структуру: (dput результаты для одного df внизу)

$K8121319_feed3_01
   coords      x.h      y.h likelihood.h     x.MB     y.MB likelihood.MB
1       0 504.3287 877.9026    0.9947414 490.1283 901.2057     0.9918574
2       1 505.9821 878.5404    0.9952422 491.2240 901.8298     0.9882244
3       2 505.7802 878.6948    0.9960060 490.9815 901.6725     0.9895840
4       3 506.5887 878.4921    0.9932485 491.3726 901.6714     0.9887711
5       4 505.5834 878.0211    0.9945126 490.8402 901.3011     0.9904280
6       5 505.3733 878.2440    0.9956381 490.7085 901.2917     0.9911127
        x.t      y.t likelihood.t      x.p      y.p likelihood.p      x.a
1  450.5128 957.8469    0.9986305 507.6661 862.6042    0.3731771 549.7861
2  451.6438 957.8253    0.9989508 507.8567 862.8673    0.4277135 550.9062
3  451.6186 958.0657    0.9989144 508.0289 862.9623    0.4955292 550.1566
4  451.9846 958.0376    0.9989387 508.5574 862.9042    0.5333622 550.7906
5  451.4842 957.7491    0.9987649 507.8273 862.8090    0.4536394 550.8159
6  451.3544 957.9151    0.9988230 507.0331 862.9991    0.4806216 550.0393
        y.a likelihood.a      x.m      y.m likelihood.m    theta heading
1  712.0231    0.9649664 618.3212 623.8601    0.3472545 13.85480      NA
2  712.1076    0.9549243 619.7942 624.1536    0.3459687 14.89937      NA
3  712.5276    0.9648149 619.7963 626.1128    0.3519055 15.41065      NA
4  714.5052    0.9606929 620.4413 626.5804    0.4425002 15.67032      NA
5  714.4543    0.9589433 620.6282 627.1456    0.4323518 14.54989      NA
6  714.6501    0.9615864 620.0085 626.9384    0.6067145 14.83284      NA
$K8121319_feed3_02
   coords      x.h      y.h likelihood.h     x.MB     y.MB likelihood.MB
1       0 492.6928 995.6010    0.9988985 500.8221 1028.505     0.9978373
2       1 492.8400 995.0040    0.9989992 500.4374 1027.900     0.9981084
3       2 492.8416 994.4175    0.9989386 500.2200 1027.537     0.9981918
4       3 492.5573 993.6464    0.9986783 499.7028 1026.006     0.9981108
5       4 492.6018 992.7993    0.9984750 499.7470 1023.899     0.9974792
6       5 492.2953 991.8393    0.9983433 499.9571 1024.894     0.9976745
        x.t      y.t likelihood.t      x.p      y.p likelihood.p      x.a
1  530.8685 1086.848    0.6761467 487.3187 976.1661   0.14095598 798.7275
2  531.3508 1086.615    0.7511309 487.6399 976.0349   0.15382832 800.8520
3  531.5408 1087.401    0.6604453 487.2163 974.9952   0.14430821 798.5768
4  530.6860 1088.123    0.6541176 487.8687 974.0737   0.15584856 798.5966
5  531.6422 1087.531    0.7950381 485.7681 972.9353   0.12393418 798.4612
6  532.8403 1087.082    0.8325000 485.4099 972.3963   0.10781968 798.8164
       y.a likelihood.a      x.m      y.m likelihood.m    theta heading
1  903.1436    0.9818143 797.3312 890.6576   0.01648542 81.05588      NA
2  902.0165    0.9836377 797.5673 890.6330   0.01425856 80.26912      NA
3  902.1720    0.9853629 797.3771 890.5745   0.01512018 79.76782      NA
4  902.0870    0.9846913 797.4385 890.6240   0.01913673 79.93355      NA
5  902.4894    0.9841179 797.4756 890.8004   0.01662260 80.82040      NA
6  901.0328    0.9826811 797.1801 890.6665   0.01670897 80.53885      NA

И так далее ... И у меня есть единственный фрейм данных, который имеет имя каждого фрейма данных в списке вместе со значениями времени для начала и конца разницы различные поведенческие состояния (dput внизу сообщения):

              File   Behavior id    START      STOP duration
1 K8121319_feed3_01   Approach  1     0.00 23554.178  393.225
2 K8121319_feed3_01 OutofFrame  2 23554.24 25517.580   32.777
3 K8121319_feed3_01   Approach  3 26476.16 27898.725   23.749
4 K8121319_feed3_01      Avoid  4 27898.78 30743.975   47.499
5 K8121319_feed3_01    Explore  5 30744.03 44719.962  233.321
6 K8121319_feed3_02   Approach  1     0.00  1788.015   29.850

Я пытаюсь использовать значения START и STOP из второго кадра данных, чтобы заполнить столбец заголовка списка кадров данных, например что когда значение coords для каждого фрейма данных в списке находится между значениями START и STOP второго df, для строки имени файла, которая соответствует имени df в списке, столбец заголовка будет содержать значение из столбца Behavior второй df.

Время начала и окончания для состояний:

structure(list(File = c("K8121319_feed3_01", "K8121319_feed3_01", 
"K8121319_feed3_01", "K8121319_feed3_01", "K8121319_feed3_01", 
"K8121319_feed3_02", "K8121319_feed3_02", "K8121319_feed3_02", 
"K8121319_feed3_02", "K8121319_feed3_02", "K8121319_feed3_02", 
"K8121319_feed3_02", "K8121319_feed3_03", "K8121319_feed3_03", 
"K8121319_feed3_03", "K8121319_feed3_03", "K8121319_feed3_03", 
"K8121319_feed3_03", "K8121319_feed3_03", "K8121319_feed3_03"
), Behavior = c("Approach", "OutofFrame", "Approach", "Avoid", 
"Explore", "Approach", "Avoid", "Approach", "Avoid", "Approach", 
"OutofFrame", "Approach", "Avoid", "Explore", "Approach", "Avoid", 
"Approach", "Avoid", "Approach", "Avoid"), id = c(1L, 2L, 3L, 
4L, 5L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 1L, 2L, 3L, 4L, 5L, 6L, 7L, 
8L), START = c(0, 23554.2374, 26476.1594, 27898.7844, 30744.0344, 
0, 1788.0749, 3989.3999, 17529.5553, 21696.3191, 26503.1743, 
27836.4285, 0, 4472.4934, 27347.0455, 41267.0268, 42172.5351, 
42471.8554, 43926.1675, 44301.1415), STOP = c(23554.1775, 25517.5797, 
27898.7245, 30743.9745, 44719.9623, 1788.015, 3989.34, 17529.4954, 
21696.2592, 26503.1144, 27836.3686, 44297.3079, 4472.4335, 27346.9856, 
41266.9669, 42172.4752, 42471.7955, 43926.1076, 44301.0816, 45116.0211
), duration = c(393.225, 32.777, 23.749, 47.499, 233.321, 29.85, 
36.749, 226.045, 69.561, 80.247, 22.257, 274.806, 74.665, 381.878, 
232.386, 15.116, 4.99599999999998, 24.2779999999999, 6.2589999999999, 
13.6039999999999)), row.names = c(NA, 20L), class = "data.frame")

Ответы [ 2 ]

2 голосов
/ 11 июля 2020

Этот подход должен работать - мы просматриваем все имена, а также сам список, чтобы выполнить поиск. Единственное, что следует отметить, это то, что при использовании findInterval() поиск выполняется только в STARTS. Исходя из данных, кажется, что этого будет достаточно, но если есть какие-либо координаты больше, чем самая большая STOP, они не будут здесь обнаружены как ошибка.

Map(function(flight, lookup) {
    tmp = lookup_DF[lookup_DF[["File"]] == lookup, c("Behavior", "START")]
    flight$heading = tmp[["Behavior"]][findInterval(flight$coords, tmp[["START"]] )]
    return(flight)
    }
    , list1
    , names(list1)
    )

##$K8121319_feed3_01
##   coords    theta    heading
##1   21230 13.85480   Approach
##2   34808 14.89937    Explore
##3   23511 15.41065   Approach
##4   38816 15.67032    Explore
##5    7274 14.54989   Approach
##6   26394 14.83284 OutofFrame
##7   18163 11.97672   Approach
##8    2769 13.40723   Approach
##9   38585 13.93966    Explore
##10  23763 15.07868 OutofFrame

##$K8121319_feed3_02
##   coords    theta    heading
##1    8582 81.05588   Approach
##2   27638 80.26912 OutofFrame
##3    6714 79.76782   Approach
##4   20496 79.93355      Avoid
##5   12542 80.82040   Approach
##6   24201 80.53885   Approach
##7   23939 80.61481   Approach
##8   26953 80.95777 OutofFrame
##9   16873 81.92905   Approach
##10  13671 81.95511   Approach
1 голос
/ 11 июля 2020

Вы можете попробовать это. List содержит все ваши фреймы данных, а StartStop содержит ограничения:

#First create and id inside all df of your list
myvar<-as.list(rep("Id",length(List)))
myval<-as.list(names(List))
List2<-Map(function(x,y,z) cbind(x,setNames(cbind(x,z)[(dim(x)[2]+1)],y)),List,myvar,myval)
#Function
merge.all <- function(x)
{
  y <- merge(x,StartStop[,c(1,2,4,5)],by.x='Id',by.y='File',all.x=T)
  y$heading <- ifelse(y$coords>=y$START & y$coords<=y$STOP,y$Behavior,y$heading)
  y <- y[!duplicated(y$coords),]
  return(y)
}
#Apply
List3 <- lapply(List2,merge.all)

После этого вы получите следующее:

List3[[1]][,c(1,2,20:25)]

                  Id coords likelihood.m    theta  heading Behavior START     STOP
1  K8121319_feed3_01      0    0.3472545 13.85480 Approach Approach     0 23554.18
6  K8121319_feed3_01      1    0.3459687 14.89937 Approach Approach     0 23554.18
11 K8121319_feed3_01      2    0.3519055 15.41065 Approach Approach     0 23554.18
16 K8121319_feed3_01      3    0.4425002 15.67032 Approach Approach     0 23554.18
21 K8121319_feed3_01      4    0.4323518 14.54989 Approach Approach     0 23554.18
26 K8121319_feed3_01      5    0.6067145 14.83284 Approach Approach     0 23554.18
31 K8121319_feed3_01      6    0.7125185 11.97672 Approach Approach     0 23554.18
36 K8121319_feed3_01      7    0.7412189 13.40723 Approach Approach     0 23554.18
41 K8121319_feed3_01      8    0.8015461 13.93966 Approach Approach     0 23554.18
46 K8121319_feed3_01      9    0.7684560 15.07868 Approach Approach     0 23554.18
51 K8121319_feed3_01     10    0.8027051 14.65594 Approach Approach     0 23554.18
56 K8121319_feed3_01     11    0.7045382 15.11358 Approach Approach     0 23554.18
61 K8121319_feed3_01     12    0.7498648 14.24839 Approach Approach     0 23554.18
66 K8121319_feed3_01     13    0.7297653 16.62184 Approach Approach     0 23554.18

Надеюсь, это поможет.

...