1

次のようなデータがあります。

DocID             Impact
CCRB-9-569  114;Adaptation - Strategic
CCRB-9-531  173;Nutrient trading
CCRB-9-886  
CCRB-9-989  
CCRB-9-530  71;Change in Temperature;65;Extreme weather events;96;Lower Rainfall
CCRB-9-671  106;Adaptation Responses;98;Climate Change
CCRB-9-570  114;Adaptation - Strategic
CCRB-9-990  
CCRB-9-526  98;Climate Change

理想的には、次のようになりたいです。

DocID             Impact
CCRB-9-569  Adaptation - Strategic
CCRB-9-531  Nutrient trading
CCRB-9-886  
CCRB-9-989  
CCRB-9-530  Change in Temperature
CCRB-9-530  Extreme weather events
CCRB-9-530  Lower Rainfall
CCRB-9-671  Adaptation Responses
CCRB-9-671  Climate Change
CCRB-9-570  Adaptation - Strategic
CCRB-9-990  
CCRB-9-526  Climate Change

試し始めました

test1=lapply(unlist(strsplit(test$Impact,"\\;")),as.character)

ただし、DocID にリンクする機能がなく、入力のない行のスペースを取得できません。アンリストを除外したり、再リストしようとしたり、cbind.fill 関数を使用したり、マージしたりしてみましたが、何かが欠けています。Impact 列の番号 (114、173 など) が出力ファイルに含まれていても、正しい DocID 番号が割り当てられていれば問題ありません。ご協力いただきありがとうございます

4

3 に答える 3

3

同様の data.table解決策

# some dummy data
.data <- data.frame(id = letters[1:5], text = c('12;a-b;34','','a-c','a-c;12;12',''))
# make both columns character, not factor, and make it a data.table
.data <- as.data.table(lapply(.data, as.character))
# for each id, split and return (returning '' if nothing)


.data[, { value = unlist(strsplit(text,split = '\\;')) 
          if (length(value) == 0) text else value },
        by = id]
于 2012-08-10T05:34:35.013 に答える
2

@csgillespieの関数をstrsplit正しく実行することができなかったので、自分で作成しました。

 foo <- function(x){  ivec <-                   
  unlist(    # needed to convert the list from strsplit to a vector.
  # The regex split pattern can be read as 
     #---- "find any sections possibly but not necessarily starting with a space or ";"
     # --- "followed necessarily by one or more digits and a ";"
  # strsplit will split and remove these segments.

     strsplit( as.character(x), split= "\\s?;?[[:digit:]]+;" ))   

   #Need to remove length zero items except for the DocID's that don't have any   

     if( any(nchar(ivec))>0){ ivec[nchar(ivec) >0 ] }else{""}
    } # end of function.

 out <- ddply(dta, .(DocID), summarise, Impact=foo(Impact) )
 out
#--------------
         DocID                 Impact
1  CCRB-9-526          Climate Change
2  CCRB-9-530   Change in Temperature
3  CCRB-9-530  Extreme weather events
4  CCRB-9-530          Lower Rainfall
5  CCRB-9-531        Nutrient trading
6  CCRB-9-569  Adaptation - Strategic
7  CCRB-9-570  Adaptation - Strategic
8  CCRB-9-671    Adaptation Responses
9  CCRB-9-671          Climate Change
10 CCRB-9-886                        
11 CCRB-9-989                        
12 CCRB-9-990                        

テストケースの構築(空白以外の区切り文字を使用する必要があります):

dta <- read.table(text="DocID     |        Impact
 CCRB-9-569 | 114;Adaptation - Strategic
 CCRB-9-531 | 173;Nutrient trading
 CCRB-9-886 | 
 CCRB-9-989 | 
 CCRB-9-530 | 71;Change in Temperature;65;Extreme weather events;96;Lower Rainfall
 CCRB-9-671 | 106;Adaptation Responses;98;Climate Change
 CCRB-9-570 | 114;Adaptation - Strategic
 CCRB-9-990 | 
 CCRB-9-526 | 98;Climate Change", header=TRUE, sep="|")
于 2012-08-10T05:54:46.510 に答える
0

plyrパッケージを使用すると、これをかなり簡単に行うことができます。まず、ダミー データを作成し、パッケージをロードします。

dd = data.frame(DocID = c("CCRB-9-569", "CCRB-9-530", "CCRB-9-886"),
                 Impact=c("114;Adaptation - Strategic", 
     "71;Change in Temperature;65;Extreme weather events;96;Lower Rainfall",
                          ""), stringsAsFactors=FALSE)
library(plyr)

Impact次に、列で機能する関数を作成します。

f = function(i) { 
    l = unlist(strsplit(as.character(i),";"))
    ##Need to determine if the string was empty
    if(length(l)> 1) l = l[seq(2, length(l), by=2)]
    return(l)

}

次に、次を使用しますddply

ddply(dd, "DocID", summarise, Impact = f(Impact))

ここではdd、入力として DocID で分離し、関数 f をf影響チャンクに適用します。


注、私の関数fは、文字列を分割することを前提としています;

関数ロジック

このplyr関数は、値に応じて小さなデータ フレームを「作成」しDocIDます。DocID次に、特定の値の形式が次のようになっていると仮定します。

 Number;string;Number;string;Number;string

に基づいて分割すると;、次のベクトルが得られます。

Number, string, Number, string, Number, string

したがって、偶数要素を選択するだけです。

l[seq(2, length(l), 2)]
于 2012-08-10T05:20:29.233 に答える