将标签附加到R中数据帧的数字代码 - 有效使用因子

时间:2016-10-18 08:04:23

标签: r loops dataframe labels factors

我有一个excel的数据,我读到它将其存储在数据框中,名称为" data"。类似地,我通过名称映射将每个变量的值标签及其代码放在单独的表中。我也阅读了这张表,并将其存储为名称" map"的数据框。

该文件的链接是 - https://www.wetransfer.com/downloads/bf0c5bfa88be20e4037d7fdc828ca66320161018075428/7f82a4

以下是阅读表格的代码 -

library("readxl")
data <- read_excel("data_v1.xlsx",sheet = "data")
map <- read_excel("data_v1.xlsx",sheet = "map")

如果您注意到代码数量较少的单元格为NA。

现在我想将值标签附加到从地图表到数据的每个代码。我正在进行搜索,我意识到其中一种方法是使用因子。我们在哪里定义级别和标签。我可以在地图文件中使用原始变量名称作为关卡,对于标签我可以使用&#34; _desc&#34;作为后缀。

有人可以建议一种有效的方法吗?我的意思是,如果我们可以在循环中执行此操作,而不是为单个变量编写代码?在我附加的数据文件中,这只是一个示例,原始数据文件将有超过100个变量,其中一个人需要执行此附加标签的任务。

最后,我如何附加变量标签?我的意思是,

Q1应该有标签&#34;就像品牌的包装一样#34; Q2应该有标签&#34;喜欢品牌的味道&#34; Q3应该有标签&#34;喜欢品牌的气味&#34; Q4应该有标签&#34;物有所值&#34;

我是否应该考虑创建一个单独的工作表,其中一列具有变量名称,另一列具有变量的标签?我们如何将这些标签附加到变量上,因为因素仅适用于我认为的值。

最后,我需要生成表/交叉表,其中应显示这些标签。应显示这些值+变量标签的图表。

谢谢!

普拉萨德

2 个答案:

答案 0 :(得分:1)

从概念上讲,你需要这样的东西

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:app="http://schemas.android.com/apk/res-auto"
xmlns:tools="http://schemas.android.com/tools"
android:id="@+id/activity_main"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:paddingBottom="@dimen/activity_vertical_margin"
android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
tools:context="com.example.shanesescott.segway.MainActivity">

<TextView
    android:text="Segway Rental"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true"
    android:layout_marginLeft="84dp"
    android:layout_marginStart="84dp"
    android:id="@+id/textView"
    android:typeface="sans"
    android:textColorLink="?attr/actionModeSplitBackground"
    android:textSize="30sp"
    android:textStyle="normal|bold"
    android:textAlignment="textStart"
    android:textColor="@color/colorPrimary"
    android:layout_alignParentTop="true" />

<TextView
    android:text="Experience the wonder of this future advancement of transportation for a city group tour starting at noon each day  "
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:layout_marginLeft="15dp"
    android:layout_marginStart="15dp"
    android:layout_marginTop="13dp"
    android:id="@+id/textView2"
    android:textSize="21sp"
    android:layout_below="@+id/textView"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true" />

<ImageView
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:srcCompat="@drawable/paris_5014_1"
    android:id="@+id/imageView4"
    android:layout_alignParentBottom="true"
    android:layout_centerHorizontal="true"
    android:layout_marginBottom="14dp" />

<Button
    android:text="RENT A SEGWAY"
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/Bdisplay"
    android:textSize="12sp"
    android:onClick="onClickButton"
    android:layout_alignBottom="@+id/imageView4"
    android:layout_centerHorizontal="true" />

你去哪里......是一个判断问题。这项任务有多重复?做某些事情会有所不同,你能提前知道它们等等吗?如果你有100个要做的事情,并且在每种情况下地图中都有一个相应的变量同名并且_desc作为后缀那么我会编写一个假定的函数,就像这样:

city_labels <- map$City_desc[match(data$City, map$City)]

在上面的评论中修复了问题后,您可以执行以下操作:

getLabels <- function(var_name) {
  map[,paste0(var_name, "_desc")][match(data[,var_name], map[,var_name])]
}

getLabels("City")

然后你有了翻译的数据集 - 将它存储在安全的地方: - )

答案 1 :(得分:0)

我会写一个for循环来完成这个重复的任务。人们需要检查数据和地图中的变量名是否相同。您的数据不可用,但我觉得下面应该可以使用。

for (i in names(data)[which(is.element(names(data),names(map)))]){
  data[[i]] <- factor(data[[i]],
                                 levels = na.omit(map[[i]]),
                                 labels = na.omit(map[[paste0(i,"_desc")]]))
}

na.oimt将省略具有NA的行。