[英]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.