Как выбрать ячейку из одного из двух столбцов? - PullRequest
2 голосов
/ 10 июля 2019

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

Что я хочу:

first.column second.column new.column
---------------------------------------
a b a
c d d

Здесь мы выбираем first.column и second.column, чтобы определить новый столбец. Мы случайным образом выбрали a из первого ряда и d из второго ряда.

Вот что я попробовал до сих пор:


set.seed(1)
first = sample(c('a', 'c'), 2)
second = sample(c('b', 'd'), 2)
my.tibble = tibble(first, second)

my.tibble = my.tibble %>% 
  mutate(
    third = sample(c(first, second), 1)
  )

my.tibble
# A tibble: 2 x 3
# first second third
# <chr> <chr>  <chr>
# 1 a     b      b    
# 2 c     d      b    

Похоже, я дважды выбрал второй ряд.

Ответы [ 3 ]

3 голосов
/ 10 июля 2019

Вы можете применить sample по строкам и связать результат с новым столбцом

df <- data.frame(col1 = c("a", "b", "c"), col2 = c("r", "t", "i"), col3 = c("w", "j", "d"))
within(df, newcol <- apply(df, 1, sample, 1))
#  col1 col2 col3 newcol
#1    a    r    w      a
#2    b    t    j      t
#3    c    i    d      d
1 голос
/ 10 июля 2019

Если вы хотите остаться с tidyverse, мы можем использовать map2_chr, если у вас есть два столбца

library(tidyverse)
my.tibble %>%  mutate(third = map2_chr(first, second, ~sample(c(.x, .y), 1)))

# A tibble: 2 x 3
#  first second third
#  <chr> <chr>  <chr>
#1   a     d      a    
#2   c     b      c    

Или, в более общем случае, для многих столбцов используйте pmap_chr

my.tibble %>%  mutate(third = pmap_chr(., ~sample(c(...), 1)))
0 голосов
/ 10 июля 2019

Мы можем использовать base R с Map

my.tibble$third <- unlist(Map(function(x, y) sample(c(x, y), 1), 
         my.tibble$first, my.tibble$second))
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...