{
 "cells": [
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "To be able to run R commands in Python, install the Python package rpy2.  \n",
    "But in my case I had to install an older version:  \n",
    "pip install rpy2==3.5.17\n",
    "\n",
    "Next execute the following command:"
   ],
   "id": "f56caa6652c8de9e"
  },
  {
   "cell_type": "code",
   "id": "initial_id",
   "metadata": {
    "collapsed": true,
    "ExecuteTime": {
     "end_time": "2026-04-09T08:07:18.843766Z",
     "start_time": "2026-04-09T08:07:18.841220Z"
    }
   },
   "source": "%load_ext rpy2.ipython",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "The rpy2.ipython extension is already loaded. To reload it, use:\n",
      "  %reload_ext rpy2.ipython\n"
     ]
    }
   ],
   "execution_count": 27
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "As usual, load the Python packages:",
   "id": "1a9d796bf761dccd"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-04-09T08:07:18.866415Z",
     "start_time": "2026-04-09T08:07:18.864416Z"
    }
   },
   "cell_type": "code",
   "source": "import pandas as pd",
   "id": "569322b8b13c2b09",
   "outputs": [],
   "execution_count": 28
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "As usual, load the R packages:",
   "id": "492b1f3788c7275a"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-04-09T08:07:18.879884Z",
     "start_time": "2026-04-09T08:07:18.873607Z"
    }
   },
   "cell_type": "code",
   "source": [
    "%%R\n",
    "library(tidyverse)"
   ],
   "id": "49ab6d4fa17e291c",
   "outputs": [],
   "execution_count": 29
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "Load data in Python:",
   "id": "b72458e408713fec"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-04-09T08:07:18.898184Z",
     "start_time": "2026-04-09T08:07:18.881240Z"
    }
   },
   "cell_type": "code",
   "source": [
    "py_data_toy = pd.read_csv(\"toy.csv\")\n",
    "py_data_toy[\"austrian\"] = py_data_toy[\"austrian\"].astype(bool)\n",
    "py_data_toy[\"marital_status\"] = pd.Categorical(py_data_toy[\"marital_status\"], categories=[\"single\", \"divorced\", \"married\"])\n",
    "py_data_toy[\"age_cat\"] = pd.Categorical(py_data_toy[\"age_cat\"], categories=[\"child\", \"adolescent\", \"adult\"], ordered=True)\n",
    "py_data_toy.head()"
   ],
   "id": "f68fa0777a79fb03",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "    name  austrian marital_status  year_birth     age_cat  temperature  \\\n",
       "0  Franz     False       divorced      1990.0       adult         37.0   \n",
       "1   Sepp     False         single      2009.0  adolescent         38.5   \n",
       "2  Maria      True         single      2005.0       adult         36.0   \n",
       "3  Georg      True         single      2019.0       child         35.4   \n",
       "4   Karl     False        married      1930.0       adult         39.0   \n",
       "\n",
       "   test_score  height  \n",
       "0         NaN   180.4  \n",
       "1        80.0   160.5  \n",
       "2         5.0   158.9  \n",
       "3        30.0   130.2  \n",
       "4         1.0   174.3  "
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>austrian</th>\n",
       "      <th>marital_status</th>\n",
       "      <th>year_birth</th>\n",
       "      <th>age_cat</th>\n",
       "      <th>temperature</th>\n",
       "      <th>test_score</th>\n",
       "      <th>height</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Franz</td>\n",
       "      <td>False</td>\n",
       "      <td>divorced</td>\n",
       "      <td>1990.0</td>\n",
       "      <td>adult</td>\n",
       "      <td>37.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>180.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Sepp</td>\n",
       "      <td>False</td>\n",
       "      <td>single</td>\n",
       "      <td>2009.0</td>\n",
       "      <td>adolescent</td>\n",
       "      <td>38.5</td>\n",
       "      <td>80.0</td>\n",
       "      <td>160.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Maria</td>\n",
       "      <td>True</td>\n",
       "      <td>single</td>\n",
       "      <td>2005.0</td>\n",
       "      <td>adult</td>\n",
       "      <td>36.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>158.9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Georg</td>\n",
       "      <td>True</td>\n",
       "      <td>single</td>\n",
       "      <td>2019.0</td>\n",
       "      <td>child</td>\n",
       "      <td>35.4</td>\n",
       "      <td>30.0</td>\n",
       "      <td>130.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Karl</td>\n",
       "      <td>False</td>\n",
       "      <td>married</td>\n",
       "      <td>1930.0</td>\n",
       "      <td>adult</td>\n",
       "      <td>39.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>174.3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 30,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 30
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "Do something in python ...",
   "id": "8ede481d09bc7f86"
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "Use the following command to import the pandas data frame py_data_toy to R:",
   "id": "68b194059304aa8c"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-04-09T08:07:18.907604Z",
     "start_time": "2026-04-09T08:07:18.899322Z"
    }
   },
   "cell_type": "code",
   "source": "%R -i py_data_toy",
   "id": "bb6c267f03a703d",
   "outputs": [],
   "execution_count": 31
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "In R the variable has the name py_data_toy, so we copy that to r_data_toy and delete py_data_toy in R only:",
   "id": "14328d0de20fb4a8"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-04-09T08:07:18.934580Z",
     "start_time": "2026-04-09T08:07:18.908892Z"
    }
   },
   "cell_type": "code",
   "source": [
    "%%R\n",
    "r_data_toy <- py_data_toy\n",
    "rm(py_data_toy)\n",
    "r_data_toy |> head()"
   ],
   "id": "6db5d1307193a9b0",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "    name austrian marital_status year_birth    age_cat temperature test_score\n",
      "0  Franz    FALSE       divorced       1990      adult        37.0        NaN\n",
      "1   Sepp    FALSE         single       2009 adolescent        38.5         80\n",
      "2  Maria     TRUE         single       2005      adult        36.0          5\n",
      "3  Georg     TRUE         single       2019      child        35.4         30\n",
      "4   Karl    FALSE        married       1930      adult        39.0          1\n",
      "5 Ulrike     TRUE        married       1980      adult        38.0          9\n",
      "  height\n",
      "0  180.4\n",
      "1  160.5\n",
      "2  158.9\n",
      "3  130.2\n",
      "4  174.3\n",
      "5  172.1\n"
     ]
    }
   ],
   "execution_count": 32
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "In Python py_data_toy is still available:",
   "id": "1e15c0576440d86a"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-04-09T08:07:18.942441Z",
     "start_time": "2026-04-09T08:07:18.935618Z"
    }
   },
   "cell_type": "code",
   "source": "py_data_toy.head()",
   "id": "9bb7f3c93cce781c",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "    name  austrian marital_status  year_birth     age_cat  temperature  \\\n",
       "0  Franz     False       divorced      1990.0       adult         37.0   \n",
       "1   Sepp     False         single      2009.0  adolescent         38.5   \n",
       "2  Maria      True         single      2005.0       adult         36.0   \n",
       "3  Georg      True         single      2019.0       child         35.4   \n",
       "4   Karl     False        married      1930.0       adult         39.0   \n",
       "\n",
       "   test_score  height  \n",
       "0         NaN   180.4  \n",
       "1        80.0   160.5  \n",
       "2         5.0   158.9  \n",
       "3        30.0   130.2  \n",
       "4         1.0   174.3  "
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>name</th>\n",
       "      <th>austrian</th>\n",
       "      <th>marital_status</th>\n",
       "      <th>year_birth</th>\n",
       "      <th>age_cat</th>\n",
       "      <th>temperature</th>\n",
       "      <th>test_score</th>\n",
       "      <th>height</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>0</th>\n",
       "      <td>Franz</td>\n",
       "      <td>False</td>\n",
       "      <td>divorced</td>\n",
       "      <td>1990.0</td>\n",
       "      <td>adult</td>\n",
       "      <td>37.0</td>\n",
       "      <td>NaN</td>\n",
       "      <td>180.4</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>Sepp</td>\n",
       "      <td>False</td>\n",
       "      <td>single</td>\n",
       "      <td>2009.0</td>\n",
       "      <td>adolescent</td>\n",
       "      <td>38.5</td>\n",
       "      <td>80.0</td>\n",
       "      <td>160.5</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>Maria</td>\n",
       "      <td>True</td>\n",
       "      <td>single</td>\n",
       "      <td>2005.0</td>\n",
       "      <td>adult</td>\n",
       "      <td>36.0</td>\n",
       "      <td>5.0</td>\n",
       "      <td>158.9</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>Georg</td>\n",
       "      <td>True</td>\n",
       "      <td>single</td>\n",
       "      <td>2019.0</td>\n",
       "      <td>child</td>\n",
       "      <td>35.4</td>\n",
       "      <td>30.0</td>\n",
       "      <td>130.2</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>Karl</td>\n",
       "      <td>False</td>\n",
       "      <td>married</td>\n",
       "      <td>1930.0</td>\n",
       "      <td>adult</td>\n",
       "      <td>39.0</td>\n",
       "      <td>1.0</td>\n",
       "      <td>174.3</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 33,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 33
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "And next we can use ggplot:",
   "id": "6b7861477a8ee1e2"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-04-09T08:07:19.057250Z",
     "start_time": "2026-04-09T08:07:18.943171Z"
    }
   },
   "cell_type": "code",
   "source": [
    "%%R\n",
    "r_data_toy |> # data\n",
    "  ggplot(aes(y = year_birth)) + # aesthetics (define what is on y axis) is used for all geom objects\n",
    "  geom_boxplot() # define geom object (plot type here boxplot)"
   ],
   "id": "eedd17d046491ebf",
   "outputs": [
    {
     "name": "stderr",
     "output_type": "stream",
     "text": [
      "R[write to console]: In addition: \n",
      "R[write to console]: Warning message:\n",
      "\n",
      "R[write to console]: Removed 1 row containing non-finite outside the scale range (`stat_boxplot()`). \n",
      "\n"
     ]
    },
    {
     "data": {
      "image/png": "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",
      "text/plain": [
       "<IPython.core.display.Image object>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "execution_count": 34
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": "Do something in R:",
   "id": "6710311463983dc0"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-04-09T08:07:19.071132Z",
     "start_time": "2026-04-09T08:07:19.058264Z"
    }
   },
   "cell_type": "code",
   "source": [
    "%%R\n",
    "r_summary <- r_data_toy |> \n",
    "  group_by(age_cat) |> \n",
    "  summarise(\n",
    "    mean_height = mean(height),\n",
    "    mean_temperature = mean(temperature),\n",
    "    .groups = \"drop\" # not necessary here\n",
    "  )\n",
    "\n",
    "r_summary"
   ],
   "id": "b59606473a3ab1c",
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "# A tibble: 4 × 3\n",
      "  age_cat    mean_height mean_temperature\n",
      "  <ord>            <dbl>            <dbl>\n",
      "1 child             130.             35.4\n",
      "2 adolescent        160.             38.5\n",
      "3 adult             NaN              37.4\n",
      "4 <NA>              NaN              39.5\n"
     ]
    }
   ],
   "execution_count": 35
  },
  {
   "metadata": {},
   "cell_type": "markdown",
   "source": [
    "And with the next code we can use r_summary in Python.\n",
    "But we use the name py_summary for the object and delete the name r_summary."
   ],
   "id": "32e92fb64f162275"
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-04-09T08:07:19.083864Z",
     "start_time": "2026-04-09T08:07:19.071827Z"
    }
   },
   "cell_type": "code",
   "source": [
    "r_summary = None  # only to make PyCharm happy (it woks without that but Pycharm thinks there is an error)\n",
    "%R -o r_summary\n",
    "py_summary = r_summary\n",
    "del r_summary\n",
    "type(py_summary)"
   ],
   "id": "997d2cc6b06e1e50",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "pandas.core.frame.DataFrame"
      ]
     },
     "execution_count": 36,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 36
  },
  {
   "metadata": {
    "ExecuteTime": {
     "end_time": "2026-04-09T08:07:19.094274Z",
     "start_time": "2026-04-09T08:07:19.084429Z"
    }
   },
   "cell_type": "code",
   "source": "py_summary",
   "id": "2d4f1e2a719b85f",
   "outputs": [
    {
     "data": {
      "text/plain": [
       "      age_cat  mean_height  mean_temperature\n",
       "1       child        130.2         35.400000\n",
       "2  adolescent        160.5         38.500000\n",
       "3       adult          NaN         37.370588\n",
       "4         NaN          NaN         39.500000"
      ],
      "text/html": [
       "<div>\n",
       "<style scoped>\n",
       "    .dataframe tbody tr th:only-of-type {\n",
       "        vertical-align: middle;\n",
       "    }\n",
       "\n",
       "    .dataframe tbody tr th {\n",
       "        vertical-align: top;\n",
       "    }\n",
       "\n",
       "    .dataframe thead th {\n",
       "        text-align: right;\n",
       "    }\n",
       "</style>\n",
       "<table border=\"1\" class=\"dataframe\">\n",
       "  <thead>\n",
       "    <tr style=\"text-align: right;\">\n",
       "      <th></th>\n",
       "      <th>age_cat</th>\n",
       "      <th>mean_height</th>\n",
       "      <th>mean_temperature</th>\n",
       "    </tr>\n",
       "  </thead>\n",
       "  <tbody>\n",
       "    <tr>\n",
       "      <th>1</th>\n",
       "      <td>child</td>\n",
       "      <td>130.2</td>\n",
       "      <td>35.400000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>2</th>\n",
       "      <td>adolescent</td>\n",
       "      <td>160.5</td>\n",
       "      <td>38.500000</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>3</th>\n",
       "      <td>adult</td>\n",
       "      <td>NaN</td>\n",
       "      <td>37.370588</td>\n",
       "    </tr>\n",
       "    <tr>\n",
       "      <th>4</th>\n",
       "      <td>NaN</td>\n",
       "      <td>NaN</td>\n",
       "      <td>39.500000</td>\n",
       "    </tr>\n",
       "  </tbody>\n",
       "</table>\n",
       "</div>"
      ]
     },
     "execution_count": 37,
     "metadata": {},
     "output_type": "execute_result"
    }
   ],
   "execution_count": 37
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "Python 3",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 2
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython2",
   "version": "2.7.6"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 5
}
