2017-03-29 15 views
0

用紙については、平均±SD形式の結果が必要です。ループのある条件に基づいた文字列の追加R

  • ないグルーピング係数(DFは、例えば、唯一の分子からのデータを持っている)、単位なし:4つの状況が存在する±は単位を有する
  • グループ化因子、単位なし
  • ないグループ化因子、SD平均:平均±SDミリリットル
  • 単位

と要因を、グループIは、最初の3つの状況を解決する機能を作ったが、私は最後に行うことはできません。以下はその例です:

df <- data.frame(treatment = c(rep(c("Stimulation", "Control"), 8)), 
       group = c(rep(c("A", "B"), 4), 
          rep(c("B", "A"), 4)), 
       value = rnorm(16, mean = 150, sd = 20)) 

df$units <- ifelse(df$group == "A", "ml", "min") 

strg <- function(df, vec, u){ 
    l <- lapply(levels(vec), function(x){ 

    list(
    Stimulation = paste(
     myround(mean(df$value[vec==x & df$treatment=="Stimulation"]), 2), "±", 
     myround(sd(df$value[vec==x & df$treatment=="Stimulation"]), 2) 
    ), 
    Control = paste(
     myround(mean(df$value[vec==x & df$treatment=="Control"]), 2), "±", 
     myround(sd(df$value[vec==x & df$treatment=="Control"]), 2) 
    )) 
}) 
    set_names(l, levels(vec)) 
} 

a <- strg(df, vec = df$group, u = df$units) 

add_unit <- function(list, vec, u){ 
    z <- lapply(list, function(x){ 
    list(
     Stimulation = paste(x$Stimulation, u[vec==x]), 
     Control = paste(x$Control, u[vec==x])) 
    }) 
} 

b <- add_unit(a, vec = df$group, u = df$units) 

問題は、[vec == x]ビットのようです。最終的な出力は平均±SDと一致した単位を持つ必要があります。グループ化係数を一致させてユニットを追加するにはどうすればよいですか?

EDIT: グループが存在する場合、最終的な結果は、次のようになりますし、私たちは何の単位が必要ない場合は、それはむしろ、次のようになりますユニットに

[[1]] 
[[1]]$Stimulation 
[1] "154.37 ± 15.9 ml" 

[[1]]$Control 
[1] "153.32 ± 15.79 ml" 


[[2]] 
[[2]]$Stimulation 
[1] "152.24 ± 17.78 min" 

[[2]]$Control 
[1] "138.48 ± 31.96 min" 

を追加したい:

[[1]] 
[[1]]$Stimulation 
[1] "154.37 ± 15.9" 

[[1]]$Control 
[1] "153.32 ± 15.79" 


[[2]] 
[[2]]$Stimulation 
[1] "152.24 ± 17.78" 

[[2]]$Control 
[1] "138.48 ± 31.96" 

(基本的に私がしようとしたのは、上記の文字列を "a"で作成し、必要に応じて最後に "b"をつけることでした)

+0

ようこそ:あなたの質問を編集し、* ideal * 'b'を追加すると、検証データを使用できます。 –

+0

そして 'a'。あなたのコードは 'paste'で爆発しています。 –

+0

@ShawnMehan私は2つの例を追加しました。それはあなたが求めていたものですか? – mariachi

答えて

1

tidyverseに書き換え全部をお勧めします(私の意見では、)再コードの意図は、はるかに読みやすく、扱いである:

library(tidyverse) 

df %>% 
    group_by(group, treatment) %>% 
    summarise(
    mean = mean(value), 
    sd = sd(value)) %>% 
    mutate(
    msd = paste(round(mean, 2), "±", round(sd, 2)), 
    unit = group %>% recode(A = "ml", B = "min", .default = ""), 
    result = if_else(unit == "", 
        msd, 
        paste(msd, unit))) 

計算/凝集はフォーマットから分離され、単位はgroup変数に依存しています。あなたが達成したいことを完全にはっきりさせることはできませんが(質問では結びつきが多すぎます)、結果は/ witout単位でそれぞれmsdresult列になります。

+0

あなたは正しいです、これははるかに簡単に管理できます!実際には、コードステップは必要ありません。これは私の望むことを行い、関数として保存することができます: 'df%>% group_by(グループ、治療、単位)%>% summary( 平均=平均値) sd = sd(値) ) msd = paste(round(mean、2)、 "±"、round(sd、2))、 result = paste(msd、units)) ' – mariachi

+0

これをもっと動的にするには、%>% mutate提供されていなければgroup_by行に "group"を含めないでください。私はifステートメントを追加して、コードなしでもう一度コードを繰り返したり、別の関数を書いたりすることもできますが、そのような小さなものはどうですか? – mariachi

+0

dplyrコールのパラメータ化は少し醜いですが、コールする前にすべてのデータを1つのグループに割り当てる方が簡単です。 – liborm

0

あなたがオブジェクトを返すa にはgroupという属性がありません。これは、add_unitと同じように機能しますが、機能しません。

1)誤差範囲と単位で文字列を作るための別々の機能::

add_unit <- function(list, vec, u){ 
    z <- lapply(1:length(list), function(x){ 
    list(
     Stimulation = paste(list[[x]]$Stimulation, u[x]), 
     Control = paste(list[[x]]$Control, u[x])) 
    }) 
} 
b <- add_unit(a, vec = df$group, u = unique(df$units)) 

strg_units <- function(df, vec, u){ 
    l <- lapply(levels(vec), function(x){   
    list(
     Stimulation = paste(
     round(mean(df$value[vec==x & df$treatment=="Stimulation"]), 2), "±", 
     round(sd(df$value[vec==x & df$treatment=="Stimulation"]), 2), 
     unique(df$units[vec==x & df$treatment=="Stimulation"])), 
     Control = paste(
     round(mean(df$value[vec==x & df$treatment=="Control"]), 2), "±", 
     round(sd(df$value[vec==x & df$treatment=="Control"]), 2), 
     unique(df$units[vec==x & df$treatment=="Control"]) 
    )) 
    }) 
} 

b <- strg_units(df, vec = df$group, u = df$units) 

2)あなたのグループは、ラベルを追加するための順序位置を持っているという事実に頼る私は2つのオプションが表示さ

順序位置への依存は、コードがはるかに壊れそうになるので、私はWHE、オプション1

+0

私は過去に実際に1)のようなものを実際に試してみました。問題は、ユニットがない文字列を作成しようとすると、文字列の末尾に空白があります。私はケース2のための完全な解決策ではないと考えています:因子をグループ化し、ユニットを持たない – mariachi