0

以前の質問に回答したユーザーからの R コードを使用しました (ここを参照してください: データ フレームの列の値を特定のタグで分割し、余分な行として追加する)。

df <- data.frame(var1 = c("A", "B", "C", "D", "E"),            

             var2 = c("test", "5 | 6", "X & Y", "M | N | O", "none"))

> df         
  var1          var2
1    A          test
2    B         5 | 6
3    C         X & Y
4    D     M | N | O
5    E          none


t1 <- c("", "|")[df$var1 %in% df$var1[grep("\\|", df$var2)]+1]

t2 <- c("", "&")[df$var1 %in% df$var1[grep("&", df$var2)]+1]

t1[which(t2 == "&")] <- "&"

df$var3 <- t1


> df
  var1          var2     var3
1    A          test     
2    B         5 | 6        |
3    C         X & Y        &
4    D     M | N | O        |
5    E          none     

Rコーディングの方法を本当に改善したいので、もっと良い方法があるかどうか疑問に思っていました。私にとって、これは達成するのが本当に簡単な仕事ではありませんでしたが、私は喜んで学びます:-)

4

4 に答える 4

2

gsubデータが実際にこれほどうまく整理されていて、適切な間隔などがあると仮定すると、と一緒に使用できますsubstring

df$var3 = substring(gsub("([a-zA-Z0-9 ])", "", df$var2), 1, 1)
df
#   var1      var2 var3
# 1    A      test     
# 2    B     5 | 6    |
# 3    C     X & Y    &
# 4    D M | N | O    |
# 5    E      none
  1. 検索パターンについては、すべての文字、数字、スペースを探し、それらを何も置き換えないでください。
  2. 次に、substring(またはsubstr)をstartおよびstopとして使用し1ます。

アップデート

に異なる句読点があると仮定すると、より一般的なアプローチは次のvar2ようになります。

gsub("[^[:punct:]]", "", df$var2)
# [1] ""   "|"  "&"  "||" ""  

繰り返しますが、を使用substrすると、各文字列の最初の文字のみを選択できます。

substr(gsub("[^[:punct:]]", "", df$var2), 1, 1)
# [1] ""  "|" "&" "|" "" 

確かにこれらの2つの区切り文字しかない場合は、検索パターンをから[^[:punct:]]に変更できます[^\\||\\&]

このアップデートの例では、^(角括弧内)はこれらの文字以外のすべてに一致することを意味します。

于 2012-07-17T11:51:18.897 に答える
1

代わりにこれを使用できます:

t3 <- rep("",length(df$var1))
t3[which(grepl("&",df$var2))] <- "&"
t3[which(grepl("\\|",df$var2))] <- "|"
df$var3 <- t3
于 2012-07-17T11:44:28.807 に答える
0

私はたった1行で私に最適な別の解決策を見つけました:-)

library(stringr)

df$var3 <- str_extract(df$var2, "\\||&")

ただし、一致するものが見つからない場所に'sを追加するコードは気にしないと言わざるを得ません。

しかし、すべてのソリューションに感謝します!本当に素晴らしい仕事です!

于 2012-07-17T13:11:18.757 に答える
0
grepl("\\|",df$var2)
grepl("&",df$var2)

と同じです

df$var1 %in% df$var1[grep("\\|", df$var2)]
df$var1 %in% df$var1[grep("&", df$var2)]+1

たとえば、次のように使用できます。

ifelse(grepl("\\|",df$var2),'|','')
ifelse(grepl("&",df$var2),'&','')
于 2012-07-17T11:46:14.690 に答える