2016-03-26 12 views
1

グローバルデータ内のデータセットの名前に似た連結文字列を渡す方法に問題があります。 Name12へNAME1はので、私はその後、私は機能文字列を関数に連結する方法R

に渡してみました

for(j in 1:12){ 
name<-paste("Name",j,sep="") 
print(name) 
} 

各データセットの名前を印刷するループのために作られたので、私は自分のコードを簡素化したいデータセット

Name1 3obs of 2variables 

Name2 4obs of 2variables 

... 

Name12 2obs of 2variables 

です

for(j in 1:12){ 
name<-paste("Name",j,sep="") 
Greetings(name) 
} 

しかし、私は

Error in name$gender : $ operator is invalid for atomic vectors 

Greetings <- function(name){ 
check<-name$gender 
if(check==male) cat("Greetings","Mr",name$person) 
else cat("Greetings","Ms",name$person) 
} 

答えて

1
に遭遇

文字列に問題はありません。それはまったく問題ありません。むしろ性別をチェックするためのデータベースが必要です。文字列に$genderを呼び出すだけで、男性か女性かを伝えることができます。名前が女性か男性かを調べることができるdata.frameまたはテーブルが必要です。

さらに、は文字列であるため、name$personも機能しません。文字列とdata.frame/tableを混在させないでください。

すでに性別を堆積さdata.frame /テーブルを持っている場合は、あなたがdataFrame[name=name,]$genderでdata.frame /テーブルからこの値を抽出する必要があり、それぞれdataFrame[name=name,]$person最初nameは、列見出しと第二nameあなたです変数には、Stringとして調べる名前が含まれています。

EDIT:nameが変数の名前を含む文字列の場合、変数を参照するにはeval(as.name(name))を使用する必要があります。

+0

名前1から名前12は既にデータフレームです(maleを引用符で囲む必要があります)。 連結された文字列を渡した後、私はその関数内のデータフレームに、そのデータフレームの名前と同じ連結文字列を使用してアクセスします。 –

+0

問題を解決するためのポストを編集しました。 @Symbolixが述べたように、あなたはまた男性を "男性"に変更する必要があります。それを働かせるには –

1

Greetingsの中には、nameは文字列であり、data.frameではありません。 Greetings機能の中にprint(name)を入れてこれを確認してください。

Greetings <- function(name){ 
    print(name) 
    # check<-name$gender 
    # if(check==male) cat("Greetings","Mr",name$person) 
    # else cat("Greetings","Ms",name$person) 
} 
Greetings(name) 
# [1] "Name1" 

が、これは単なる文字列、

あなたdata.frameを参照するために、文字列nameを使用するには、あなたがあなたのRオブジェクトを参照するためにget()を使用する必要はありませんあなたのdata.frameであることを参照してください。

は、この例のデータを考えてみましょう:Greetings機能で

Name1 <- data.frame(gender= c("male"), 
        person= c("a"), stringsAsFactors = FALSE) 

## Create a string representing the data.frame as per your original code 
## (can be done in a loop) 
name <- paste("Name", "1", sep="") 

、あなたはget(name)でdata.frameを参照することができます。

Greetings <- function(name){ 
    check <- get(name) 

    ## note this will only work as expected with a data.frame 
    ## with one row. 
    if(check$gender=="male") cat("Greetings","Mr", check$person) 
    else cat("Greetings","Ms",check$person) 
} 

Greetings(name) 
# Greetings Mr a 
関連する問題