Соответствующие значения в двух столбцах затем основаны на том, что возвращают новое значение в R - PullRequest
2 голосов
/ 28 октября 2019

У меня есть эти столбцы в кадре данных, которые выглядят следующим образом:

combination  color_1  color_2

1_1          red       red
1_2          red       blue
1_3          red       green
1_4          red       yellow
2_1          blue      red
2_2          blue      blue
2_3          blue      green
2_4          blue      yellow
... 

Исходя из сопоставления значений color_1 и color_2, я хотел бы иметь возможность создавать новые столбцы, которые выводят результат соответствия, Для этого есть определенные спецификации. Для первой строки, где «красный» и «красный» одинаковы, вывод в новом столбце (например, «Только красный») должен быть «1»,а затем "2" для каждого другого матча. Затем я бы повторил этот код, но затем выбрал совпадения, в которых встречаются «синий» и «синий», чтобы вывести «1» в следующем столбце (например, «только для синего») и «2» везде. Это касается матчей только желтого цвета, матчей только зеленого цвета и т. Д. В итоге у меня будет 4 дополнительных столбца в зависимости от условия.

Спасибо за помощь заранее!

Ответы [ 3 ]

3 голосов
/ 28 октября 2019

Давайте начнем с ваших существующих данных:

df <- structure(list(combination = c("1_1", "1_2", "1_3", "1_4", "2_1", 
"2_2", "2_3", "2_4"), color_1 = c("red", "red", "red", "red", 
"blue", "blue", "blue", "blue"), color_2 = c("red", "blue", "green", 
"yellow", "red", "blue", "green", "yellow")), class = "data.frame", row.names = c(NA, 
-8L))

  combination color_1 color_2
1         1_1     red     red
2         1_2     red    blue
3         1_3     red   green
4         1_4     red  yellow
5         2_1    blue     red
6         2_2    blue    blue
7         2_3    blue   green
8         2_4    blue  yellow

Одним из решений будет цикл по четырем категориям цветов, проверка на совпадения.

colors <- c('red', 'green', 'yellow', 'blue')

matches <- lapply(colors, function(x) {
  out <- ifelse(with(df, color_1 == color_2 & color_1 == x), 1, 2)
  out
})

И затем присвоение имен результатамэта операция с вашими именами столбцов.

names(matches) <- paste(colors, 'only', sep = '_')

И, наконец, склеивание результатов вместе с исходными данными:

df.new <- cbind(df, as.data.frame(matches))

  combination color_1 color_2 red_only green_only yellow_only blue_only
1         1_1     red     red        1          2           2         2
2         1_2     red    blue        2          2           2         2
3         1_3     red   green        2          2           2         2
4         1_4     red  yellow        2          2           2         2
5         2_1    blue     red        2          2           2         2
6         2_2    blue    blue        2          2           2         1
7         2_3    blue   green        2          2           2         2
8         2_4    blue  yellow        2          2           2         2
1 голос
/ 28 октября 2019

Вот способ, который не зависит от знания названий цветов.

fun <- function(color, DF, col1, col2){
  2L - (color == DF[[col1]] & color == DF[[col2]])
}

cols1 <- unique(df1$color_1)
cbind(df1, sapply(cols1, fun, df1, 'color_1', 'color_2'))
#  combination color_1 color_2 red blue
#1         1_1     red     red   1    2
#2         1_2     red    blue   2    2
#3         1_3     red   green   2    2
#4         1_4     red  yellow   2    2
#5         2_1    blue     red   2    2
#6         2_2    blue    blue   2    1
#7         2_3    blue   green   2    2
#8         2_4    blue  yellow   2    2

Данные.

df1 <- read.table(text = "
combination  color_1  color_2
1_1          red       red
1_2          red       blue
1_3          red       green
1_4          red       yellow
2_1          blue      red
2_2          blue      blue
2_3          blue      green
2_4          blue      yellow
", header = TRUE, stringsAsFactors = FALSE)
1 голос
/ 28 октября 2019

Вы можете использовать ifelse. Если у вас много циклов, было бы неплохо

cols <- data.frame(
color_1=c("Red","Red","Red","Red","Blue","Blue","Blue","Blue"),
color_2=c("Red","Blue","Green","Yellow","Red","Blue","Green","Yellow")
) 

cols$redonly <- ifelse( cols$color_1 %in% "Red" & cols$color_2 %in% "Red" , 1 ,2 )
cols$Blueonly <- ifelse( cols$color_1 %in% "Blue" & cols$color_2 %in% "Blue" , 1 ,2 )
cols$greeonly <- ifelse( cols$color_1 %in% "Green" & cols$color_2 %in% "Green" , 1 ,2 )
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...