Прежде всего, я добавил stringsAsFactors = FALSE
к вашим входным фреймам данных, потому что в моем решении проще работать со строками, чем с факторами.
df1 <- data.frame(group = rep("A", 5),
name = c("Brandon",
"Kyler",
"Trent",
"Lesa",
"Michael"),
gender = c("M", "F", "M", "F", "M"),
days = c(50, 45, 32, 60, 48),
stringsAsFactors = FALSE)
df2 <- data.frame(group = rep("B", 10),
name = c("Erica",
"Jared",
"Sara",
"Helen",
"Tom",
"Ron",
"Cy",
"Lynn",
"Ken",
"Judy"),
gender = c("F", "M", "F", "F", "M", "M", "M", "F", "M", "F"),
days = c(47, 49, 62, 80, 74, 30, 55, 58, 63, 25),
stringsAsFactors = FALSE)
library(tidyverse)
# empty dataframe for the output
df2_new <- data.frame(group = character(),
name = character(),
gender = character(),
days = numeric(),
stringsAsFactors = FALSE)
for(i in 1:nrow(df1)){
# add the row of interest to the output dataframe
df2_new[i,] <- df2 %>%
mutate(day_diff = abs(days - df1$days[i])) %>%
filter(gender == df1$gender[i]) %>%
slice(which.min(day_diff)) %>%
select(-day_diff)
# remove the newly added row from the original dataset
df2 <- df2 %>%
filter(!(name %in% df2_new$name))
}
Это первое решение, которое пришло в голову. В этом случае строки удаляются из df2
по мере продолжения цикла for, поскольку вы сказали, что
хотите отфильтровать
blockquote>df2
, чтобы включить только самое близкое соответствие каждой строке в [ 116]Вывод
df2_new group name gender days 1 B Jared M 49 2 B Erica F 47 3 B Ron M 30 4 B Sara F 62 5 B Cy M 55
В моем случае код выбирал Сару вместо Линн, но это выбор 50/50.
Необходимо было бы перенаправить обоих входные и выходные потоки, с помощью Process
; это - немного более хитрая обработка обоих, так как необходимо быть осторожными, что вещи не потеряны в буферах (порождение мертвой блокировки).
Вы могли бы также хотеть посмотреть на OutputDataReceived для основанных на событии ответов.
Если все приложения разрабатываются в dotnet, можно использовать класс блока