Удаление части строки и использование ее для пересечения с другим фреймом данных - PullRequest
2 голосов
/ 28 марта 2019

У меня есть два кадра данных, которые я пытаюсь сравнить и найти их перекрытие на основе столбца строк.Тем не менее, некоторые из них имеют дополнительное и ненужное дополнение к ним.Например, «C8 H12 O1» в одном df должен быть равен «C8 H12 O1 Na1».Я хочу удалить «Na1» из любой строки, которая может иметь его.

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

list1 <- c('C8 H12 O1 Na1', 'C15 H20 O7 Na1', 'C18 H24 O6', 'C24 H32 O9 Na1')
list2 <- c('C8 H12 O1', 'C19 H26 O7 Na1', 'C18 H24 O6', 'C24 H32 O9 Na1')
df1 <- data.frame(list1)
colnames(df1) <- "Composition"
df2 <- data.frame(list2)
colnames(df2) <- "Composition"
paste0(round(100*length(intersect(df1$Composition, 
                                  df2$Composition))/nrow(df2)), "%")

# [1] "50%"

Технически реальный процент должен составлять 75% из-за того, что первая запись имеет "ту же самую" строку минус Na1.

Ответы [ 2 ]

0 голосов
/ 28 марта 2019

Вы можете использовать startsWith.Следующее суммирует все соответствующие комбинации и делит на длину list2 ...

sum(outer(list1, list2, startsWith),
    outer(list2, list1, startsWith)) / length(list2)

[1] 0.75
0 голосов
/ 28 марта 2019

Вы можете игнорировать Na1, бросая gsub вокруг него.

paste0(round(100*length(intersect(gsub(" Na1", "", df1$Composition), 
                                  gsub(" Na1", "", df2$Composition)))/nrow(df2)), "%")
# [1] "75%"
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...