Интерактивный фрейм данных - PullRequest
0 голосов
/ 07 января 2020

Я хочу построить фрейм данных, такой как df2, из df1, ища всегда имя столбца со значением closets в 0: где clossets_1 - значение ближе к 0 из столбцов x, y и z. clossets_2 - ближе к 0 из столбцов x и a, потому что x является наиболее полученным значением в clossets_1. clossets_3 - ближе к 0 столбцов a и b, потому что a является наиболее полученным значением в clossets_2.

df1 
x  y  z  a  b 
1  2  3  4  3 
2  3  4  1  2 
3  2  4  2  1 
4  3  2  3  6 

df2 
 x  y  z clossets_1 a clossets_2 b clossets_3
 1  2  3     x      4     x      3    b
 2  3  4     x      1     a      2    a 
 3  2  4     y      2     a      1    b 
 4  3  2     z      3     a      2    b


Ответы [ 2 ]

1 голос
/ 07 января 2020

Вот первый шаг к началу работы:

cols = c("x","y","z")
df2 = df1
df2$clossets_1 = cols[apply(df1[,cols], 1, function(x) {which(x == min(x))})]
df2
##   x y z a b clossets_1
## 1 1 2 3 4 3          x
## 2 2 3 4 1 2          x
## 3 3 2 4 2 1          y
## 4 4 3 2 3 6          z
0 голосов
/ 10 января 2020

Я решил это так:

library(DescTools) 
library(modeest) 
library(tibble) 

df1 = tibble(x = c(1,2,3,4),
             y = c(2,3,2,3),
             z = c(3,4,4,2),
             clossest_1 = c("x","y","z")[apply(data.frame(x,y,z),1,function(x){which(x == Closest(x,0))})],
             a = c(4,1,2,3),
             clossest_2 = c(mlv(clossest_1),"a")[apply(data.frame(get(mlv(clossest_1)),a),1,function(x){which(x == Closest(x,0))})],
             b = c(3,2,1,2),
             clossest_3 = c(mlv(clossest_2),"b")[apply(data.frame(get(mlv(clossest_2)),b),1,function(x){which(x == Closest(x,0))})])
df1


# A tibble: 4 x 8
      x     y     z clossest_1     a clossest_2     b clossest_3
  <dbl> <dbl> <dbl> <chr>      <dbl> <chr>      <dbl> <chr>     
1     1     2     3 x              4 x              3 b         
2     2     3     4 x              1 a              2 a         
3     3     2     4 y              2 a              1 b         
4     4     3     2 z              3 a              2 b         
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...