Подстановка одного фрейма данных из другого не дает ожидаемого результата - PullRequest
0 голосов
/ 23 мая 2018

У меня есть 2 кадра данных df1 и df2.

df1 содержит 2 столбца - t1 и data1, с t1, начиная с 0,0001 до 75, с приращением0,0001.Таким образом, это идет как 0,0001, 0,0002, 0,0003 ..... 74,9999, 75,0000.data1 - это просто числа от 0 до 1.

df2 также содержит 2 столбца - t2 и data2, но длина каждого столбца равна 114 - присутствуют только выбранные значения от 0,0001 до 75в столбце времени - например.14.6000,15.2451, .... 73,4568.data2 - снова случайные числа длиной 114. Я извлек значения t2 из другого набора данных

t2<- c(14.6000, 14.6001, 14.6002, 14.6002, 14.6007, 14.6011, 14.6016, 14.602, 14.6037, 14.6055, 14.6072, 14.6089, 14.6151, 14.6214, 14.6277, 14.6339, 14.6402, 14.6545, 14.6688, 14.6831, 14.6974, 14.7117, 14.7261, 14.7573, 14.7886, 14.8199, 14.8511, 14.8824, 14.9137, 14.9681, 15.0225, 15.0768, 15.1312, 15.1856, 15.24, 15.3233, 15.4065, 15.4897, 15.573, 15.6562, 15.7394, 15.8768, 16.0142, 16.1516, 16.289, 16.4264, 16.5638, 16.7676, 16.9715, 17.1753, 17.3792, 17.583, 17.7868, 17.9907, 18.3366, 18.6826, 19.0285, 19.3745, 19.7204, 20.0664, 20.4124, 20.9122, 21.412, 21.9118, 22.4116, 22.9114, 23.4112, 23.911, 24.5965, 25.282, 25.9675, 26.653, 27.3385, 28.024, 29.1158, 30.2075, 31.2993, 32.3911, 33.4828, 34.6828, 35.8828, 37.0828, 38.2828, 39.4828, 40.6828, 41.8828, 43.0828, 44.2828, 45.4828, 46.6828, 47.8828, 49.0828, 50.2828, 51.4828, 52.6828, 53.8828, 55.0828, 56.2828, 57.4828, 58.6828, 59.8828, 61.0828, 62.2828, 63.4828, 64.6828, 65.8828, 67.0828, 68.2828, 69.4828, 70.6828, 71.8828, 73.0828, 74.2828,74.6000)


df1<- data.frame("t1"=seq(0.0001,75,0.0001), "data1"=c(rnorm(750000)))

df2<- data.frame("t2"=t2, "data2"=c(rnorm(length(t2))))

Я хочу создать новый фрейм данных - df_new, в котором я хочу выбрать значенияt2 и соответствующих data1 значений из df1

df_new<- subset(df1,t1 %in% df2$t2)

Когда я это делаю, df_new имеет только 74 наблюдения вместо 114. Я что-то здесь не так делаю?

1 Ответ

0 голосов
/ 23 мая 2018

Это, похоже, проблема с арифметикой с плавающей запятой.Смотрите два примера ниже.В общем, прямое сравнение таких операций не обязательно будет надежным, поскольку точность представления не идеальна.Я выбрал первый элемент в df2$t2, который не соответствует ожидаемому.Вы бы надеялись, что первое сравнение == вернет true, но это не так.Посмотрите, что all.equal, который вводит в заблуждение тесты "почти равенство", фактически возвращает true для двух объектов, которые я вытащил.Вы можете увидеть разницу, изменив цифры, напечатанные с помощью options.

. Один из способов получить ожидаемый результат - использовать round, чтобы все числа, которые вы хотите, были одинаковыми.Обратите внимание, что в вашем выводе только 113 строк, поскольку в df2$t2 есть только 113 уникальных значений.Вы также можете рассмотреть возможность преобразования в целые числа (с соответственно меньшими единицами измерения).

t2<- c(14.6000, 14.6001, 14.6002, 14.6002, 14.6007, 14.6011, 14.6016, 14.602, 14.6037, 14.6055, 14.6072, 14.6089, 14.6151, 14.6214, 14.6277, 14.6339, 14.6402, 14.6545, 14.6688, 14.6831, 14.6974, 14.7117, 14.7261, 14.7573, 14.7886, 14.8199, 14.8511, 14.8824, 14.9137, 14.9681, 15.0225, 15.0768, 15.1312, 15.1856, 15.24, 15.3233, 15.4065, 15.4897, 15.573, 15.6562, 15.7394, 15.8768, 16.0142, 16.1516, 16.289, 16.4264, 16.5638, 16.7676, 16.9715, 17.1753, 17.3792, 17.583, 17.7868, 17.9907, 18.3366, 18.6826, 19.0285, 19.3745, 19.7204, 20.0664, 20.4124, 20.9122, 21.412, 21.9118, 22.4116, 22.9114, 23.4112, 23.911, 24.5965, 25.282, 25.9675, 26.653, 27.3385, 28.024, 29.1158, 30.2075, 31.2993, 32.3911, 33.4828, 34.6828, 35.8828, 37.0828, 38.2828, 39.4828, 40.6828, 41.8828, 43.0828, 44.2828, 45.4828, 46.6828, 47.8828, 49.0828, 50.2828, 51.4828, 52.6828, 53.8828, 55.0828, 56.2828, 57.4828, 58.6828, 59.8828, 61.0828, 62.2828, 63.4828, 64.6828, 65.8828, 67.0828, 68.2828, 69.4828, 70.6828, 71.8828, 73.0828, 74.2828,74.6000)

set.seed(12345)
df1<- data.frame("t1"=seq(0.0001,75,0.0001), "data1"=c(rnorm(750000)))

df2<- data.frame("t2"= t2, "data2"=c(rnorm(length(t2))))

df2$t2[2]
#> [1] 14.6001
df1$t1[146001]
#> [1] 14.6001

df1$t1[146001] == df2$t2[2]
#> [1] FALSE
all.equal(df1$t1[146001], df2$t2[2])
#> [1] TRUE

options(digits = 22)
df2$t2[2]
#> [1] 14.600099999999999
df1$t1[146001]
#> [1] 14.600100000000001

df_new_rnd <- subset(df1, round(t1, 4) %in% round(df2$t2, 4))
df_new_int <- subset(df1, as.integer(t1 * 10000) %in% as.integer(df2$t2 * 10000))
nrow(df_new_rnd)
#> [1] 113
nrow(df_new_int)
#> [1] 113

Создано в 2018-05-22 с помощью пакета prex (v0.2.0).

...