質問するログイン新規登録

Q&A

解決済

1回答

2445閲覧

「同じ大きさのデータフレームに対してだけ定義されています」とは、どう言うこと。計算が出来ない。

pontoon

総合スコア28

R

R言語は、「S言語」をオープンソースとして実装なおした、統計解析向けのプログラミング言語です。 計算がとても速くグラフィックも充実しているため、数値計算に向いています。 文法的には、統計解析部分はS言語を参考にしており、データ処理部分はSchemeの影響を受けています。 世界中の専門家が開発に関わり、日々新しい手法やアルゴリズムが追加されています。

0グッド

1クリップ

投稿2022/11/06 21:25

0

1

前提

単純に、時系列の数値の成長率を計算しようとしている。
それをやった途端、
‘/’ は同じ大きさのデータフレームに対してだけ定義されています

実現したいこと

D_rate = dat[i,j-1]*100/dat[i,j-1]
の計算をさせたいだけ。

発生している問題・エラーメッセージ

Error in Ops.data.frame(dat[i, j - 1] * 100, dat[i, j - 1]) :
‘/’ は同じ大きさのデータフレームに対してだけ定義されています

該当のソースコード

R (RStudioの下で使っています)
0711M  0811T  0911W  1011T
Orc-01 65    53   43   34
Orc-02 75   71   68    85
Orc-03 67    57    80    54
Orc-04 58    78    84    87
Orc-05 87    88    79    85
なるYld.txt
と言う入力に対して、

dat <- read.table("Yld.txt")
colnames(dat) <- NULL
rownames(dat) <- NULL
print(dat)
R <- nrow(dat)
C <- ncol(dat)
Daily_Growth_Rate <- matrix(0, nrow = R, ncol = C)

Daily Growth Rate by orchard

for (i in 1:R)
for (j in 2:C)
{
D_rate = (dat[i,j] - dat[i,j-1])*100/dat[i,j-1]
Daily_Growth_Rate[i,j] = round(D_rate, digits=1)
}
Daily_Growth_Rate

試したこと

D_rate = (dat[i,j] - dat[i,j-1])*100/dat[i,j-1]
の部分を
D_rate <- (dat[i,j] - dat[i,j-1])*100/dat[i,j-1]
にしたり、変数のD_rateを介さずに、
Daily_Growth_Rate[i,j] = round(((dat[i,j] - dat[i,j-1])*100/dat[i,j-1]), digits=1)
としても、同じだった。

補足情報(FW/ツールのバージョンなど)

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

melian

2022/11/07 00:47

colnames(dat) <- NULL を外すとよいかと。
KojiDoi

2022/11/07 05:39

dat[i,j-1]*100/dat[i,j-1] この式、正しいんですか? あと、前回も言いましたが、コードの提示を正しくしてください。回答者に無駄な手間をかけさせないでください。
pontoon

2022/11/07 06:21

KojiDoiさん Melianさん。 すみませんでした。 紛らわしいコードを入れて。 でも、melianさんの言われるように、 colnames(dat) <- NULL を外すと全部で、比率(成長率)が入って来ています。 [,1] [,2] [,3] [,4] [1,] 0 -18.5 -18.9 -20.9 [2,] 0 -5.3 -4.2 25.0 [3,] 0 -14.9 40.4 -32.5 [4,] 0 34.5 7.7 3.6 最終コードは、 dat <- read.table("Yld.txt") # colnames(dat) <- NULL rownames(dat) <- NULL print(dat) R <- nrow(dat) C <- ncol(dat) Daily_Growth_Rate <- matrix(0, nrow = R, ncol = C) # Daily Growth Rate by orchard for (i in 1:R) for (j in 2:C) { D_rate = (dat[i,j]- dat[i,j-1])*100/dat[i,j-1] Daily_Growth_Rate[i,j] = round(D_rate, digits=1) } Daily_Growth_Rate でした。 お詫び申し上げます。
melian

2022/11/07 06:42 編集

データフレーム内で計算を行う場合はカラム名を削除しない方がよいです。カラム名が付いていないと今回の様な問題が発生する場合があるからです。
guest

回答1

0

自己解決

colnames(dat) <- NULL
rownames(dat) <- NULL
とあるところを
melianさんのご指摘を受け、
# colnames(dat) <- NULL
rownames(dat) <- NULL
としたら、皆、無事、比率で出てくるようになりました。
これが、悪さしているとは思わなかったです。
皆様、ありがとうございました。

投稿2022/11/07 06:51

pontoon

総合スコア28

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.29%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問