如何在 R 中的另一个 table 中获取值?

How to get a value in another table in R?

我的问题对你们中的许多人来说可能很简单。我有一个包含类别列表的小标题,类别列表旁边有与该类别相关的值。 我想根据这些值创建一个数据集。为此,我创建了一个新的 tibble。在一列中,我随机绘制了其中一个类别(函数示例,替换 =T)。在第二列中,我想为该类别的特征值添加噪声。 我的问题是找出如何在另一个 table.

中引用与此特定类别相关的单元格

这里有一个例子:

library(tidyverse)

carac <- tibble(
  class = c("raptor","valor","defender"),
  weight = c(123,125,596)
)

test <- tibble(
  serie = sample(carac$class,100, replace=T),
  weight = weight_of_this_class*rnorm(1,mean=1, sd=0.2)
    )

我不知道用什么代替“weight_of_this_class”?我尝试了 carac[class],但显然不起作用:/

我想要的是这样的 table :

# A tibble: 100 x 2
   serie    weight
   <chr>     <dbl>
 1 raptor     142.5
 2 defender   660.3
 3 raptor     129.6
 4 valor      132.1
 5 defender   822.3
 6 defender   611.5
 7 valor      117.4
 8 raptor     112.7
 9 valor      150.6
10 defender   712.6
# ... with 90 more rows

(我想要的例子是手动计算的数据,例如猛禽只是“123*rnorm(1,mean=1, sd=0.2)”。)

非常感谢!

一种方法是简单地预先采样,将其存储在 s 中,然后用 s:

carac$classcarac$weight 进行子集化
n <- 100
s <- sample(nrow(carac), n, r = T)
test <- tibble(
  serie = carac$class[s],
  weight = carac$weight[s] * rnorm(n, mean = 1, sd = 0.2)
)

您可以使用 match 获取对应的 weightserie 值选择。

tibble::tibble(
  serie = sample(carac$class,100, replace=TRUE),
  weight = carac$weight[match(serie, carac$class)]*rnorm(1,mean=1, sd=0.2)
)

当您使用 tidyverse 时,您可以只使用 slice_sample...

test <- carac %>% 
  slice_sample(n = 100, replace = TRUE) %>%    #sample from the rows of carac
  mutate(weight = weight * rnorm(100, mean = 1, sd = 0.2)) #add noise
test <- tibble(
            serie = sample(carac$class,100, replace=T),
            weight = sapply(serie, 
                     function(x){carac[carac$class==x, 2][[1]]})
                     *rnorm(1,mean=1, sd=0.2)
)

另一种方法:

serie = data.frame(class = sample(carac$class,100, replace=T))
test = as_tibble(merge(serie, carac, by = "class", all.x = TRUE))
test$weight = test$weight * rnorm(1,mean=1, sd=0.2)