R 如何从两列中的一列对单元格进行采样?

R 如何从两列中的一列对单元格进行采样?,r,R,我想在我的数据框中定义一个新的.column。new.column从其他两列之一获取一个值。new.column的给定单元格应仅对同一行中其他列的单元格进行采样 我想要的是: first.column second.column new.column --------------------------------------- a b a c d d 这里,我们对first.column和second.column进行采样以定义新列。我们从第一行随机选取a,从第二行随机选取d 以下是我迄今为

我想在我的数据框中定义一个新的.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    

看起来我对第二行进行了两次采样。

您可以按行应用采样并将结果属性化到新列

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
如果您想继续使用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    
我们可以将base R与Map一起使用

您必须使用rowwise,以便让流程知道您希望分别从每一行进行采样。试试这个:my.tibble%>%rowwise%>%mutatethird=samplecffirst,second,1%>%ungroup使用基R.cbindmy.tibble,third=applymy.tibble,MARGIN=1,sample,size=1。顺便说一句,使用set.seed(例如set.seed1)可以使采样重现。
my.tibble %>%  mutate(third = pmap_chr(., ~sample(c(...), 1)))
my.tibble$third <- unlist(Map(function(x, y) sample(c(x, y), 1), 
         my.tibble$first, my.tibble$second))