Соответствие значения в% в% - PullRequest
0 голосов
/ 24 декабря 2018

Я создал цикл, в котором я перебираю фрейм данных, где сопоставляю значения с другим фреймом данных.Я хочу найти совпадения по двум переменным.Два кадра данных содержат одинаковые переменные.

, например:

X1 <- c(4247857)
X2 <- c(4.66)
dataframe1 <- data.frame(X1, X2)

X1 <- c(4247850, 4247888, 4247857, 4020051)
X2 <- c(4.55, 3.66, 4.66, 3.05)
dataframe2 <- data.frame(X1, X2)

tempvar <- dataframe1[1, "X2"]
dataframe1[1,"X2"] %in% dataframe2[dataframe2$X2 == tempvar, "X2"]

Вот результаты:

dataframe1[1,"X2"] %in% dataframe2[dataframe2$X2 == tempvar, "X2"]
TRUE

Это то, что я хочу, но результат с моимреальные данные:

 dataframe1[3, "X2"]
 3.05

dataframe2[dataframe2$X2 == tempvar, "X2"]
3.05
3.05
3.05
4.66
3.05
4.66
4.66
3.05
4.66
3.05
4.66

dataframe1[3,"X2"] %in% dataframe2[dataframe2$X2 == tempvar, "X2"]
    FALSE

В чем может быть причина, почему я получаю ЛОЖЬ здесь?

Ответы [ 2 ]

0 голосов
/ 24 декабря 2018

Я до сих пор не могу понять, что вызывает несоответствие, но я нашел обходной путь для этого.

вместо проверки 2 переменных, как в примере, я теперь использую semi_join для каждой переменной и проверяю, совпадают ли они.Это дает мне истинное значение для всех переменных, как это:

temp <- semi_join(dataframe2, dataframe1[i,], by= "X1") 
temp2 <-semi_join(temp, dataframe1, by= "X2")
if(datafram1[i,"X2"] == unique(temp2$X2))
0 голосов
/ 24 декабря 2018

В этом случае, я думаю, вы можете выбрать merge, что намного быстрее и эффективнее, чем использование циклов:

# create a flag to see if it works correctly
df1$flag <- 1

# merge the data
df3 <- merge(df, df1[,c('X2','X3','flag')], by = c('X2','X3'), all.x = T)

  X2   X3 X1  X4 flag
1  A 0.10  1 yes   NA
2  B 3.66  2  no   NA
3  B 4.66  1 yes    1
4  C 3.05  1 yes   NA

# now you can do the next step on df3
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...