![](/img/trans.png)
[英]How to extract a particular number from a string of one column and store it in another column of data frame using R?
[英]How to properly manipulate a string column in a data frame in R?
我有一個data.frame,其中的字符串列包含句點,例如“ abcX”。 我想按句點將字符串分開,並在給出的示例中保留第三段,例如“ c”。 這是我在做什么。
> df = data.frame(v=c("a.b.a.X", "a.b.b.X", "a.b.c.X"), b=seq(1,3))
> df
v b
1 a.b.a.X 1
2 a.b.b.X 2
3 a.b.c.X 3
我想要的是
> df = data.frame(v=c("a.b.a.X", "a.b.b.X", "a.b.c.X"), b=seq(1,3))
> df
v b
1 a 1
2 b 2
3 c 3
我試圖使用within
,但我發現了奇怪的結果。 第一列第一行中的值正在重復。
> get = function(x) { unlist(strsplit(x, "\\."))[3] }
> within(df, v <- get(as.character(v)))
v b
1 a 1
2 a 2
3 a 3
最佳做法是什么? 我究竟做錯了什么?
更新:這是我從@agstudy的答案中使用的解決方案:
> df = data.frame(v=c("a.b.a.X", "a.b.b.X", "a.b.c.X"), b=seq(1,3))
> get = function(x) gsub(".*?[.].*?[.](.*?)[.].*", '\\1', x)
> within(df, v <- get(v))
v b
1 a 1
2 b 2
3 c 3
問題不在於within
而在於您的get
函數。 它返回一個字符( "a"
),將其添加到data.frame中后將被回收。 您的代碼應如下所示:
get.third <- function(x) sapply(strsplit(x, "\\."), `[[`, 3)
within(df, v <- get.third(as.character(v)))
這是一種可能的解決方案:
df[, "v"] <- do.call(rbind, strsplit(as.character(df[, "v"]), "\\."))[, 3]
## > df
## v b
## 1 a 1
## 2 b 2
## 3 c 3
使用一些正則表達式,您可以執行以下操作:
gsub(".*?[.].*?[.](.*?)[.].*", '\\1', df$v)
[1] "a" "b" "c"
或更簡潔:
gsub("(.*?[.]){2}(.*?)[.].*", '\\2', v)
這個問題的答案“我在做什么錯”是的代碼,你想到的是提取每個分割字符串的第三個元素中的位實際上是把所有的字符串的所有元素中的一個載體,然后返回的第三個元素那:
get = function(x) {
splits = strsplit(x, "\\.")
print("All the elements: ")
print(unlist(splits))
print("The third element:")
print(unlist(splits)[3])
# What you actually wanted:
third_chars = sapply(splits, function (x) x[3])
}
within(df, v2 <- get(as.character(v)))
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.