Как объединить определенную строку из группы строк с одинаковой ссылкой # с df, который содержит одну строку с совпадающей ссылкой # - PullRequest
1 голос
/ 16 апреля 2020

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

У меня есть 2 кадра данных. Один содержит одну строку данных, которая мне нужна, которая имеет уникальный ссылочный номер.

Мне нужно объединить Ph и Dissolved02 из первого фрейма данных в один с широтой и долготой. Но мне нужны только значения из последней строки каждого уникального ссылочного номера или, другими словами, самые глубокие значения pH и Dissolved02. Конечный кадр данных будет иметь только одно вхождение каждого ссылочного номера. Образец каждого фрейма данных может быть создан с помощью следующего кода (может быть, гораздо более простой способ ввода данных в переполнение стека?) ...

sample.df <- readLines(textConnection("BBM2008050101    0.2 B   24.8    52.1    8.2 34.3    6.1 
BBM2008050101   1.0 B   24.8    52.4    8.2 34.5    6.1 
BBM2008050101   1.4 B   24.8    52.4    8.2 34.5    6.1 
BBM2008050102   0.2 B   24.5    53.0    8.1 35.0    6.3 
BBM2008050102   1.0 B   24.5    53.0    8.1 34.9    6.0 
BBM2008050102   1.6 B   24.5    53.0    8.1 35.0    5.9 
BBM2008050103   0.2 B   24.9    51.1    8.2 33.5    6.1 
BBM2008050103   1.0 B   24.9    51.1    8.2 33.5    6.1 
BBM2008050103   1.6 B   24.9    51.1    8.2 33.5    6.1 
BBM2008050104   0.2 B   25.1    51.4    8.2 33.8    6.7 
BBM2008050104   1.0 B   25.1    51.4    8.2 33.8    6.5 
BBM2008050104   1.6 B   25.1    51.4    8.2 33.8    6.5 
BBM2008050105   0.2 B   24.9    51.9    8.1 34.1    7.7 
BBM2008050105   1.0 B   24.9    51.9    8.2 34.1    7.9 
BBM2008050106   0.2 B   25.4    51.1    8.3 33.5    7.0 
BBM2008050106   1.0 B   25.4    51.1    8.3 33.5    6.5 
BBM2008050106   2.0 B   25.4    51.1    8.3 33.5    6.5 
BBM2008050106   2.3 B   25.4    51.1    8.3 33.5    6.4 "))

sample.df <- strsplit(sample.df,"[[:space:]]+")

max.len <- max(sapply(sample.df, length))
corrected.list <- lapply(sample.df, function(x) {c(x, rep(NA, max.len - length(x)))})
df <- do.call(rbind, corrected.list)
colnames(df) <- c("Reference",  "Depth",    "Beg_end",  "Temperature",  "Conductivity", "pH",   "Salinity", "DissolvedO2")
df <- as.data.frame(df)



sample.df2 <- readLines(textConnection("BBM2008050101   301 -83.44165   29.637633   1.6 D
BBM2008050102   301 -83.439717  29.630233   1.8 D
BBM2008050103   301 -83.434017  29.605567   1.8 D
BBM2008050104   301 -83.440067  29.596267   1.8 D
BBM2008050105   301 -83.4346    29.592667   1.2 D
BBM2008050106   300 -83.44555   29.596917   2.5 D"))

sample.df2 <- strsplit(sample.df2,"[[:space:]]+")

max.len2 <- max(sapply(sample.df2, length))
corrected.list2 <- lapply(sample.df2, function(x) {c(x, rep(NA, max.len2 - length(x)))})
df2 <- do.call(rbind, corrected.list2)
colnames(df2) <- c("Reference", "Gear", "Longitude",    "Latitude", "StartDepth",   "Zone")
df2 <- as.data.frame(df2)

Вывод будет sample.df3 с самым глубоким значением Ph и Добавлены столбцы Dissolved02. Как показано ниже, но, очевидно, мой фрейм данных намного больше, и я не могу сделать это вручную.


sample.df3 <- readLines(textConnection("BBM2008050101   301 -83.44165   29.637633   1.6 D  8.2  6.1
BBM2008050102   301 -83.439717  29.630233   1.8 D  8.1  5.9
BBM2008050103   301 -83.434017  29.605567   1.8 D  8.2  6.1
BBM2008050104   301 -83.440067  29.596267   1.8 D  8.2  6.5
BBM2008050105   301 -83.4346    29.592667   1.2 D  8.2  7.9
BBM2008050106   300 -83.44555   29.596917   2.5 D  8.3  6.4"))

sample.df3 <- strsplit(sample.df3,"[[:space:]]+")

max.len3 <- max(sapply(sample.df3, length))
corrected.list3 <- lapply(sample.df3, function(x) {c(x, rep(NA, max.len3 - length(x)))})
df3 <- do.call(rbind, corrected.list3)
colnames(df3) <- c("Reference", "Gear", "Longitude",    "Latitude", "StartDepth",   "Zone", "pH", "Dissolved02")
df3 <- as.data.frame(df3)

Ответы [ 2 ]

1 голос
/ 17 апреля 2020

Опция, использующая data.table:

DT2[, c("pH", "Dissolved02") := 
    DT1[.SD, on=.(Reference), mult="last", .(pH, DissolvedO2)]
]

выход (DT2):

       Reference Gear Longitude Latitude StartDepth Zone  pH Dissolved02
1: BBM2008050101  301 -83.44165 29.63763        1.6    D 8.2         6.1
2: BBM2008050102  301 -83.43972 29.63023        1.8    D 8.1         5.9
3: BBM2008050103  301 -83.43402 29.60557        1.8    D 8.2         6.1
4: BBM2008050104  301 -83.44007 29.59627        1.8    D 8.2         6.5
5: BBM2008050105  301 -83.43460 29.59267        1.2    D 8.2         7.9
6: BBM2008050106  300 -83.44555 29.59692        2.5    D 8.3         6.4

данные:

library(data.table)
DT1 <- fread("Reference Depth Beg_end Temperature Conductivity pH Salinity DissolvedO2
BBM2008050101    0.2 B   24.8    52.1    8.2 34.3    6.1 
BBM2008050101   1.0 B   24.8    52.4    8.2 34.5    6.1 
BBM2008050101   1.4 B   24.8    52.4    8.2 34.5    6.1 
BBM2008050102   0.2 B   24.5    53.0    8.1 35.0    6.3 
BBM2008050102   1.0 B   24.5    53.0    8.1 34.9    6.0 
BBM2008050102   1.6 B   24.5    53.0    8.1 35.0    5.9 
BBM2008050103   0.2 B   24.9    51.1    8.2 33.5    6.1 
BBM2008050103   1.0 B   24.9    51.1    8.2 33.5    6.1 
BBM2008050103   1.6 B   24.9    51.1    8.2 33.5    6.1 
BBM2008050104   0.2 B   25.1    51.4    8.2 33.8    6.7 
BBM2008050104   1.0 B   25.1    51.4    8.2 33.8    6.5 
BBM2008050104   1.6 B   25.1    51.4    8.2 33.8    6.5 
BBM2008050105   0.2 B   24.9    51.9    8.1 34.1    7.7 
BBM2008050105   1.0 B   24.9    51.9    8.2 34.1    7.9 
BBM2008050106   0.2 B   25.4    51.1    8.3 33.5    7.0 
BBM2008050106   1.0 B   25.4    51.1    8.3 33.5    6.5 
BBM2008050106   2.0 B   25.4    51.1    8.3 33.5    6.5 
BBM2008050106   2.3 B   25.4    51.1    8.3 33.5    6.4")

DT2 <- fread("Reference Gear Longitude Latitude StartDepth Zone
BBM2008050101   301 -83.44165   29.637633   1.6 D
BBM2008050102   301 -83.439717  29.630233   1.8 D
BBM2008050103   301 -83.434017  29.605567   1.8 D
BBM2008050104   301 -83.440067  29.596267   1.8 D
BBM2008050105   301 -83.4346    29.592667   1.2 D
BBM2008050106   300 -83.44555   29.596917   2.5 D")
1 голос
/ 16 апреля 2020

Ниже используется dplyr group_by и суммирование для получения последней строки, в которой находится ссылка, затем фильтр DF1 в последних строках для каждой ссылки и, наконец, объединение во всех столбцах из DF2

library(dplyr)

df$id <- c(1:nrow(df)) # Create ID Column to store row number

# Create a smaller df with just the references and the max row number (which should equal the last occurance)
df1_last_references <- df %>%
  group_by(Reference) %>%
  summarise(id = max(id))

# Filter Original DF on the row numbers matching from the last references
df <- df[which(df$id %in% df1_last_references$id), ]

# merge in the columns from DF2
df3 <- merge(df, df2, all.x = T, by = 'Reference')

head(df3)
      Reference Gear  Longitude  Latitude StartDepth Zone  pH Dissolved02
1 BBM2008050101  301  -83.44165 29.637633        1.6    D 8.2         6.1
2 BBM2008050102  301 -83.439717 29.630233        1.8    D 8.1         5.9
3 BBM2008050103  301 -83.434017 29.605567        1.8    D 8.2         6.1
4 BBM2008050104  301 -83.440067 29.596267        1.8    D 8.2         6.5
5 BBM2008050105  301   -83.4346 29.592667        1.2    D 8.2         7.9
6 BBM2008050106  300  -83.44555 29.596917        2.5    D 8.3         6.4
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...