Как получить общие значения между двумя столбцами в R? - PullRequest
1 голос
/ 13 марта 2020

Dataframe в качестве примера:

df <- data.frame(x = c("A,B,C","A,D","B,C,E","C,E,G"),
                 y = c("A","D","A",NA),
                 MyAim = c("A","D","",""))

      x    y MyAim
1 A,B,C    A     A
2   A,D    D     D
3 B,C,E    A      
4 C,E,G <NA>      

Я хочу получить общие значения между столбцами x и y в новом. Заранее спасибо.

Ответы [ 3 ]

2 голосов
/ 13 марта 2020

Мы можем использовать mapply:

df$Z <- mapply(function(x, y) {
            temp <- intersect(x, y)
            if(length(temp)) temp else ""
        }, strsplit(df$x, ","), df$y)

df
#      x    y Z
#1 A,B,C    A A
#2   A,D    D D
#3 B,C,E    A  
#4 C,E,G <NA>  

Если в y есть несколько значений, мы можем разбить строку на y и вернуть значение, разделенное запятыми.

df$Z <- mapply(function(x, y) {
     temp <- intersect(x, y)
     if(length(temp)) toString(temp) else ""
     }, strsplit(df$x, ","), strsplit(df$y, ","))

данные

df <- data.frame(x = c("A,B,C","A,D","B,C,E","C,E,G"),
                 y = c("A","D","A",NA),
                 stringsAsFactors = FALSE)
1 голос
/ 13 марта 2020

strsplit можно легко использовать в apply, который приводит к характеру, попробуйте

df <- transform(df, MyAim=apply(df, 1, function(x) {
  s <- el(strsplit(x[1], ","))
  s[match(x[2], s)]
  }))
df
# x    y MyAim
# 1 A,B,C    A     A
# 2   A,D    D     D
# 3 B,C,E    A  <NA>
# 4 C,E,G <NA>  <NA>
0 голосов
/ 13 марта 2020

Если x является символом, то один из многих способов сделать это:

intersect(unlist(strsplit(df$x, split=",")), df$y)

Если x не символ, тогда strsplit будет обрабатывать sh, поэтому следующее требуется:

intersect(unlist(strsplit(as.character(df$x), split=",")), df$y)

И чтобы добавить это к фрейму данных,

myAim <- intersect(unlist(strsplit(as.character(df$x), split=",")), df$y)
df$myAim <- c(myAim, rep(NA, nrow(df)-length(myAim)))
df
      x    y myAim
1 A,B,C    A     A
2   A,D    D     D
3 B,C,E    A  <NA>
4 C,E,G <NA>  <NA>

Примечание. Если y содержит значения, подобные x, то длина myAim может быть больше, чем количество строк в кадре данных. В этой ситуации добавление результата во фрейм данных может показаться неуместным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...