簡體   English   中英

創建新的數據框列

[英]Create new data frame column

我的數據框看起來像這樣:

df <- data.frame(INFO=c("A;B;C", "B;A;C"), METRICS=c("1;2;3", "4;5;6"))
df
   INFO METRICS
1 A;B;C   1;2;3
2 B;A;C   4;5;6

我正在嘗試使用apply()捕獲每一行的 'A' 值,並將結果向量存儲在原始數據框的新列中:

df$M1 <- apply(
   df,
   1,
   function(x){
      info <- unlist(strsplit(x[1], ";"))
      metric <- unlist(strsplit(x[2], ";"))
      for(i in 1:3){
         ifelse(
            info[i]=="A", 
            metric[i],
            "."
         )
      }
   }
)

為了得到以下結果:

df
   INFO METRICS M1
1 A;B;C   1;2;3  1
2 B;A;C   4;5;6  5

但未創建新列。

我們可以在";"上拆分字符串並使用mapply獲取METRICS的相應值,其中INFO == "A"

df$M1 <- mapply(function(x, y) y[x == "A"], strsplit(df$INFO, ";"),
                                            strsplit(df$METRICS, ";"))
df

#   INFO METRICS M1
#1 A;B;C   1;2;3  1
#2 B;A;C   4;5;6  5

數據

確保數據被讀取為字符而不是因子。

df <- data.frame(INFO=c("A;B;C", "B;A;C"), METRICS=c("1;2;3", "4;5;6"),
                  stringsAsFactors = FALSE)

也許您可以嘗試如下apply

df$M1<-apply(df, 1, function(x) {
  unlist(strsplit(x[2],split = ";"))[unlist(strsplit(x[1],";"))=="A"]
})

以至於

> df
   INFO METRICS M1
1 A;B;C   1;2;3  1
2 B;A;C   4;5;6  5

一種向量化的方法是在拆分后取消列表並使其成為命名向量,即

i1 <- setNames(unlist(strsplit(as.character(df$METRICS), ';')), 
               unlist(strsplit(as.character(df$INFO), ';')))

那么簡單地說,

i1[names(i1) == 'A']
#  A   A 
#"1" "5" 

或將其添加到您的數據框中,

 df$M1 <- i1[names(i1) == 'A']

#   INFO METRICS M1
#1 A;B;C   1;2;3  1
#2 B;A;C   4;5;6  5

您也可以嘗試grepRaw()

ind <- sapply(df$INFO, grepRaw, pattern = "A", fixed = TRUE)
substring(df$METRICS, ind, ind)

[1] "1" "5"

暫無
暫無

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

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