Dit is een site voor studenten van de Open Universiteit. Voordat je een vraag kunt stellen moet je even een account aanmaken (dit systeem is niet gekoppeld aan je OU studentnummer en wachtwoord).

Welkom bij het vraag- en antwoord systeem van de onderzoeks-practica van de studie psychologie bij de Open Universiteit.

Houd er, als je een vraag stelt, rekening mee dat je de richtlijnen volgt!

0 leuk 0 niet-leuks

Beste docenten,

Momenteel ben ik bezig met het leren van R(studio) met als doel om item-response theorie analyses te kunnen uitvoeren. Helaas lukt het mij niet goed om de gegevens uit R te halen. De plotjes gaan prima, maar de tabellen zijn een ander verhaal.

Ik gebruikte eerst write.table(), maar ik kreeg hier niet het gewenste resultaat mee. Toen met xlsx package lukte het mij om het eerste tabel naar excel te krijgen. Simpele tabellen gingen prima, maar grotere stukken output bestaan uit meerdere datatypes. Dat ging minder goed. Mijn oplossing was om gericht een vector/stukje matrix te callen met \$, met:

write.xlsx(mydata\$variable, file = "mydata.xlsx")

Helaas heb ik dan maar een stukje van het tabel. Ik zou handmatig elk stukje apart kunnen callen en dit kunnen knippen en plakken in excel.. maar het moet makkelijker kunnen.

Ik zat zelf te denken aan:

write.xlsx(mydata\$variable1,mydata\$variable2, etc file = "mydata.xlsx")

Maar dat vindt R niet leuk. Toen dacht ik aan:

write.xlsx ([ , c(mydata\$variable1,mydata\$variable2], file = "mydata.xlsx")

Kortom, het lukt mij niet om mijn output in één tabel te krijgen.

in R en RStudio door (160 punten)

1 Antwoord

0 leuk 0 niet-leuks

Je bent al een heel eind op weg. Er zijn allerlei manieren om matrices en dataframes te 'slicen'. Je tweede optie is in principe goed - daar gebruik je 'indexering'. Een lijst in R (en matrices en dataframes zijn speciale gevallen van lijsten) kunnen via de indices van de elementen worden aangesproken met de [ en ] symbolen. Alleen:

  1. Als je via indices wil werken moeten de rechte haken volgen op het object (de lijst; in jouw geval het dataframe of de matrix) dat je wil 'slices';
  2. Je bent een sluitend haakje vergeten;
  3. Indices zijn strings of getallen; jij biedt hele vectoren aan (die je uit je dataframe sliced met $)

Dus, als we dat combineren, komen we op:

write.xlsx(mydata[ , c('variable1', 'variable2')], file = "mydata.xlsx");

Et voila :-)

door (77.8k punten)

Beste Gjalt-Jorn,

Bedankt voor je reactie. Helaas krijg ik de error:

Error in mydata[, c("resp.patterns", "Tobs", "p.values")] :incorrect number of dimensions

Dit was de code:

write.xlsx(mydata[ , c('resp.patterns', 'Tobs', 'p.values')], file = "mydata.xlsx")

Ik heb ook dit nog gedaan:

write.xlsx(mydata[, c(mydata$resp.patterns, mydata$Tobs, mydata$p.values)], file = "mydata.xlsx")

Een wellicht koppige poging om toch de hele vectoren te callen. Ik ben pas net begonnen met R en probeer alles wat ik maar kan verzinnen! 
Hieronder staat (een deel van) het tabel in kwestie.
Person-Fit Statistics and P-values

Call:
ltm(formula = LSAT ~ z1, IRT.param = TRUE)

Alternative: Inconsistent response pattern under the estimated model

   Item 1 Item 2 Item 3 Item 4 Item 5      L0      Lz Pr(<Lz)
1       0      0      0      0      0 -4.0633 -1.2085  0.1134
2       0      0      0      0      1 -3.8211 -0.9436  0.1727
3       0      0      0      1      0 -4.6645 -1.8837  0.0298
4       0      0      0      1      1 -3.9565 -1.1454   0.126
5       0      0      1      0      0 -6.1607 -3.5228  0.0002
6       0      0      1      0      1 -5.3157 -2.5662  0.0051
7       0      0      1      1      0 -6.1306 -3.4011  0.0003
8       0      0      1      1      1 -4.8129 -2.0687  0.0193

Dit impliceert dat 'mydata' niet tweedimensionaal is.

Als je dit intypt, wat zie je dan?

str(mydata);

Hij zou moeten zeggen dat het een dataframe of matrix is. Maar msch is het een vector?

Het voorbeeld van je output impliceert overigens dat dat een object is; waar die tabel dan vast en zeker ergens in zit, maar die uit nog meer bestaat. Zo'n object is een lijst ('list') met sub-objecten, waaronder bijvoorbeeld een matrix.

Het str commando kan helpen uit te vinden hoe je precies die matrix er uit trekt.

Aldus de output van str(mydata):

> str(mydata)
List of 8
 $ resp.patterns   : num [1:30, 1:5] 0 0 0 0 0 0 0 0 0 0 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : NULL
  .. ..$ : chr [1:5] "Item 1" "Item 2" "Item 3" "Item 4" ...
 $ Tobs            : num [1:30, 1:2] -4.06 -3.82 -4.66 -3.96 -6.16 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:30] "1" "2" "3" "4" ...
  .. ..$ : chr [1:2] "L0" "Lz"
 $ p.values        : num [1:30, 1] 0.113434 0.172693 0.029805 0.126014 0.000213 ...
  ..- attr(*, "dimnames")=List of 2
  .. ..$ : chr [1:30] "1" "2" "3" "4" ...
  .. ..$ : chr "Lz"
 $ alternative     : chr "less"
 $ FUN             : NULL
 $ simulate.p.value: logi FALSE
 $ B               : num 1000
 $ call            : language ltm(formula = LSAT ~ z1, IRT.param = TRUE)
 - attr(*, "class")= chr "persFit"
$ resp.patterns, $ Tobs, $ p.values bestaan zo te zien uit meerdere componenten. Als ik het goed zeg, heeft iedere variabele een vector van getallen en names? Beide zijn zo te zien met 'chr' aangeduid. 

Probeer dit eens?

mergedData <- cbind(mydata$resp.patterns,
                    mydata$Tobs,
                    mydata$p.values);

write.xlsx(mergedData, file = "mydata.xlsx");

Ja! Hij werkt. Als ik het goed begrijp heb je met cbind() dus de verschillende onderdelen samen weten te voegen en dit weer apart als 'mergedData' opgeslagen. Dit is wat ik probeerde te doen met:

write.xlsx ([ , c(mydata$variable1,mydata$variable2], file = "mydata.xlsx")

Dus als ik het goed begrijp was mijn gedachtegang wel in de juiste richting, maar had ik de code niet om R te vertellen wat ik exacte wilde?

In ieder geval heel erg bedankt voor je hulp!

...