2016-07-21 23 views
0

私は2つのデータフレームを持っています。最初のデータフレームの最後の列(Bill)では、固定価格+数量*価格/数量を適用したいと考えています。関数を適用するには、Rはdf1の最初の列の値とdf2の列名を一致させる必要があります。あるデータフレーム内のフィールドと別のデータフレーム内の列名を一致させる

私は関数といくつかのifelse文を作成することで問題を解決しましたが、df1の値とdf2の列名を自動的に一致させる文を使用したいと考えています。私が持っているデータセットには200万以上の行が含まれていて、他の同様の機能を構築するのに同じ論理的根拠を適用する必要があります。ループを必要としないか、処理に時間がかかりすぎるものを使用するとよいでしょう。

see what the data frame should look like here

+2

あなたはこのデータフレームを作るコードを投稿することができれば、それをいただければ幸いですので、プロセスは再現可能になります。 –

+0

質問がRStudioコードエディタに関係する場合は、 'rstudio'タグだけを使用してください。文法に関する質問をするときに 'ペンと紙の'タグを使用しないでください! – Gregor

答えて

1
### Set up your data frames like so ### 
Code <- c("a1", "a2", "c3", "a1") 
Name <- c("Dan", "David", "Anna", "Lisa") 
Quantity <- c(30, 12, 10, 10) 

df1 <- as.data.frame(cbind("Code" = Code, "Name" = Name, "Quantity" = Quantity), stringsAsFactors = F) 
df1$Quantity <- as.numeric(df1$Quantity) 

fixed_price <- c(12, 5, 23) 
price_per_qty <- c(1, 4, 7) 

df2 <- as.data.frame(rbind("fixed_price" = fixed_price, "price_per_qty" = price_per_qty)) 
colnames(df2) <- c("a1", "a2", "c3") 

### Combine dataframe 1 and 2 into a single dataframe ### 

# Code below pulls individual columns from df2 based on the 
# index provided by the "Code" column in df1, transposes them 
# so they'll line up with df1, then column binds them to df1 
df3 <- cbind(df1, t(df2[,df1$Code])) 

# the bill is calculated simply enough 
bill <- df3[4] + df3[3] * df3[5] 
colnames(bill) <- "bill" 
# Finally, output the results as you wanted 
cbind(df3, bill) 
+0

cbind関数を使い、df1でインデックスするうまい方法$ Code –

+0

これは非常に便利でした。ありがとう。 – Irina

0

だから私はgraggsdにかなり類似した答えを持っていますが、ここでは私のために働いていたものです。私は、キーワード "Code"に基づいて2つのデータフレームをマージし、それをcombined_dataの大きなデータフレームに結合しました。私はあなたが上で定義したものと思っている関数を使って、それぞれのデータフレームを渡しました。

df2 <- t(data.frame(c(12,1),c(5,4),c(23,7))) 
rownames(df2) <- c("a1","a2","c3") 
test <- rownames(df2) 
df2 <- cbind.data.frame(df2,test) 
colnames(df2) <- c("fixed price","price/qty","Code") 


df1 <- data.frame(c("a1","a2","c3","a1"), c("Dan","David","Anna","Lisa"),c(30,12,10,10)) 
colnames(df1) <- c("Code","Name","Quantity") 


combined_data <- dplyr::inner_join(df1,df2, by = "Code") 



f1 <- function(x,y,z){ 
    x + y * z 
} 
bill <- f1(combined_data[,4],combined_data[,3],combined_data[,5]) 

finalDataSet <- cbind.data.frame(combined_data,bill) 

最終的なデータセット:

Code Name Quantity fixed price price/qty bill 
1 a1 Dan  30   12   1 42 
2 a2 David  12   5   4 53 
3 c3 Anna  10   23   7 93 
4 a1 Lisa  10   12   1 22 
関連する問題