簡體   English   中英

在嵌套在數據框中的列表變量中進行子集和替換

[英]Subsetting and replacing in a list variable nested in a dataframe

這是我的數據框示例。 它包含一個名為“dta”的列變量,它是我想為每個場景保留的n個值的單個列表:

set.seed(777)
df <- data.frame(theo = numeric(),
                 size = numeric(),
                 dta  = I(list()))
df[ 1: 5,"theo"]  <- qlnorm(0.1, meanlog=0, sdlog=1, lower.tail = TRUE, log.p = FALSE)
df[ 6:10,"theo"]  <- qlnorm(0.2, meanlog=0, sdlog=1, lower.tail = TRUE, log.p = FALSE)
df[ 1: 5,"size"]  <- 10
df[ 6:10,"size"]  <- 20
for(i in 1:10){
     df$dta[i] <- list(rlnorm(df$size[i], meanlog = 0, sdlog = 1))
     }
df
str(df)

這應該給df像:

        theo size          dta
1  0.2776062   10 1.631967....
2  0.2776062   10 0.737667....
3  0.2776062   10 0.131252....
4  0.2776062   10 1.937334....
5  0.2776062   10 0.739868....
6  0.4310112   20 4.631176....
7  0.4310112   20 2.610180....
8  0.4310112   20 0.175918....
9  0.4310112   20 3.501670....
10 0.4310112   20 0.588178....

要么:

'data.frame':   10 obs. of  4 variables:
 $ theo: num  0.278 0.278 0.278 0.278 0.278 ...
 $ size: num  10 10 10 10 10 20 20 20 20 20
 $ dta :List of 10
  ..$ : num  1.632 0.671 1.667 0.671 5.148 ...
  ..$ : num  0.738 1.056 0.152 0.967 10.089 ...
  ..$ : num  0.131 1.256 0.457 3.574 4.211 ...
  ..$ : num  1.937 2.359 3.496 0.297 4.587 ...
  ..$ : num  0.74 0.66 0.481 0.434 1.874 ...
  ..$ : num  4.631 0.298 10.28 0.933 1.286 ...
  ..$ : num  2.61 0.472 0.251 1.61 0.303 ...
  ..$ : num  0.176 0.566 2.156 0.407 3.52 ...
  ..$ : num  3.502 1.748 1.283 0.648 1.359 ...
  ..$ : num  0.588 0.392 2.447 1.926 0.86 ...
  ..- attr(*, "class")= chr "AsIs"

現在,我希望以下列方式對該列表進行子集化:

  1. 對於每個列表,將每個值與存儲在數據幀中的固定值“theo”進行比較
  2. 當該值低於或等於“theo”時,則重新編碼該值NA

這是一個有效的代碼,它給了我我想要的東西:

df$dta2 <- df$dta
for(i in 1:10){
     df$dta2[[i]] [ df$dta2[[i]] <= df$theo[i] ] <- NA
     }

但是我想知道有沒有辦法用一行代碼獲得相同的結果而沒有“for循環”來繼續條件替換嵌套在數據幀中的列表中包含的值?

我們可以使用Map

df$dta3 <- Map(function(x,y) replace(x, x<=y, NA), df$dta, df$theo)
all.equal(df$dta2, df$dta3, check.attributes=FALSE)
#[1] TRUE

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM