如何从两列之一中采样细胞?

时间:2019-07-10 11:42:52

标签: r

我想在数据框中定义一个new.column。 new.column从其他两列之一中获取一个值。如果new.column的给定单元格位于同一行,则应仅对其他列的单元格进行采样。

我想要什么:

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

在这里,我们对first.columnsecond.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 个答案:

答案 0 :(得分:3)

您可以按行应用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 :(得分:1)

如果您想停留在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)))

答案 2 :(得分:0)

我们可以将base RMap一起使用

my.tibble$third <- unlist(Map(function(x, y) sample(c(x, y), 1), 
         my.tibble$first, my.tibble$second))