7

私は R にまったく慣れていないので、あえてここで質問するのはこれが初めてです。

リッカート スケールを使用してデータセットを使用しています。名前の最初の文字列を共有するさまざまな列のグループで行合計を計算したいと考えています。

以下では、従ったアプローチを説明するために 2 行のみのデータ フレームを作成しましたが、より効率的な方法を作成する方法についてフィードバックを受け取りたいと考えています。

df <- as.data.frame(rbind(rep(sample(1:5),4),rep(sample(1:5),4)))

var.names <- c("emp_1","emp_2","emp_3","emp_4","sat_1","sat_2"
           ,"sat_3","res_1","res_2","res_3","res_4","com_1",
           "com_2","com_3","com_4","com_5","cap_1","cap_2",
           "cap_3","cap_4")

names(df) <- var.names

それで、私がしたことは、特定の文字列で始まる指定された変数の行を合計し、それらを新しい変数に格納できるようにするために、grep関数を使用することでした。しかし、変数ごとに新しいコード行を書かなければなりません。

df$emp_t <- rowSums(df[, grep("\\bemp.", names(df))])
df$sat_t <- rowSums(df[, grep("\\bsat.", names(df))])
df$res_t <- rowSums(df[, grep("\\bres.", names(df))])
df$com_t <- rowSums(df[, grep("\\bcom.", names(df))])
df$cap_t <- rowSums(df[, grep("\\bcap.", names(df))])

しかし、データセットにはさらに多くの変数があり、1 行のコードだけでこれを行う方法があるかどうか知りたいです。たとえば、同じ文字列で始まる変数をグループ化し、行関数を適用する方法があります。

前もって感謝します!

4

4 に答える 4

3

考えられる解決策の 1 つは、ベース R関数 ( を使用)をdf使用して正しい列の合計を転置して計算することです。rowsumset.seed(123)

cbind(df, t(rowsum(t(df), sub("_.*", "_t", names(df)))))
#   emp_1 emp_2 emp_3 emp_4 sat_1 sat_2 sat_3 res_1 res_2 res_3 res_4 com_1 com_2 com_3 com_4 com_5 cap_1 cap_2 cap_3 cap_4 cap_t
# 1     2     4     5     3     1     2     4     5     3     1     2     4     5     3     1     2     4     5     3     1    13
# 2     1     3     4     2     5     1     3     4     2     5     1     3     4     2     5     1     3     4     2     5    14
#   com_t emp_t res_t sat_t
# 1    15    14    11     7
# 2    15    10    12     9
于 2015-05-21T21:16:43.603 に答える
2

reshape2データを長い形式 ( 、を参照) で表示したいという MrFlick の意見に同意しますがtidyr、質問には次のように答えてください。

cbind(
  df, 
  sapply(split.default(df, sub("_.*$", "_t", names(df))), rowSums)
)

トリックを行います

于 2015-05-21T21:16:51.147 に答える
1

データを整頓された形式にすると、長期的にはより良い結果が得られます。問題は、データが長い形式ではなく幅の広い形式であることです。そして変数名、例えば はemp_1、実際には 2 つの別々のデータです: 個人のクラスと個人の ID 番号 (またはそのようなもの) です。これは、dplyr と tidyr に関する問題の解決策です。

library(dplyr)
library(tidyr)
df %>% 
  gather(key, value) %>% 
  extract(key, c("class", "id"), "([[:alnum:]]+)_([[:alnum:]]+)") %>% 
  group_by(class) %>% 
  summarize(class_sum = sum(value))

まず、データ フレームを でワイド フォーマットからロング フォーマットに変換しgather()ます。次に、値emp_1を別々の列classに分割idし、 extract(). 最後に、クラスごとにグループ化し、各クラスの値を合計します。結果:

Source: local data frame [5 x 2]

  class class_sum
1   cap        26
2   com        30
3   emp        23
4   res        22
5   sat        19
于 2015-05-21T21:27:56.643 に答える