我想在数据框中定义一个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
好像我采样了第二行两次。
答案 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 R
与Map
一起使用
my.tibble$third <- unlist(Map(function(x, y) sample(c(x, y), 1),
my.tibble$first, my.tibble$second))