R:如何将分类变量转换为虚拟变量,并折叠ID变量

时间:2018-01-19 14:57:50

标签: r

我正在研究R.

我有一个包含2列的数据框:一个标识符,一些标识符多次出现,以及一个分类变量。

每个标识符可以有多个类别。

我试图将其转换为仅包含虚拟变量而非分类变量的数据集。这也要求每个标识符变量只有一行,即使有些行在原始数据框中多次出现(为了匹配多个类别)。

换句话说,我试图解决这个问题:

data.frame(ID = c("A", "B", "C", "A", "C", "B"), 
       Color = c("Red", "Blue", "Green", "Blue", "Blue", "Red"))

进入这个:

data.frame(ID = c("A", "B", "C"), 
       Color_Red = c(1, 1, 0), 
       Color_Blue = c(1, 1, 1), 
       Color_Green = c(0, 0, 1))

有什么想法吗?

非常感谢!

3 个答案:

答案 0 :(得分:2)

另一种重塑的解决方案:

df = data.frame(ID = c("A", "B", "C", "A", "C", "B"), 
                Color = c("Red", "Blue", "Green", "Blue", "Blue", "Red"))

library(tidyverse)

df %>%
  mutate(counts = 1) %>%
  spread(Color, counts, fill = 0)

#   ID Blue Green Red
# 1  A    1     0   1
# 2  B    1     0   1
# 3  C    1     1   0

答案 1 :(得分:1)

with(df,table(ID,Color))
   Color
ID  Blue Green Red
  A    1     0   1
  B    1     0   1
  C    1     1   0

如果您需要将结果作为数据框,则可以重塑

dcast(data.frame(with(df,table(ID,Color))),ID~Color)
  ID Blue Green Red
1  A    1     0   1
2  B    1     0   1
3  C    1     1   0

答案 2 :(得分:0)

使用public class SpinnerTestFragment extends Fragment { private MainActivity activity; private static final String SELECTED_THEME_IDX_STORAGE_KEY = "mSelectedTheme_IDX_StorageKey"; private static final String SELECTED_AIM_IDX_STORAGE_KEY = "mSelectedAim_IDX_StorageKey"; private static final String SELECTED_GOAL_IDX_STORAGE_KEY = "mSelectedGoal_IDX_StorageKey"; private static String TAG = "SpinnerTestFragment"; private Spinner spnrThemes; private Spinner spnrAims; private Spinner spnrGoals; private String mSelectedTheme; private String mSelectedAim; private String mSelectedGoal; private int mSelectedAimIdx = -1; private int mSelectedThemeIdx = -1; private int mSelectedGoalIdx = -1; //----------------------------------------------------------------------------------------// public SpinnerTestFragment() { }//ctor //----------------------------------------------------------------------------------------// @Override public View onCreateView(LayoutInflater inflater, ViewGroup container, Bundle savedInstanceState) { Log.d(TAG, "onCreateView"); activity = (MainActivity) getActivity(); // Inflate the layout for this fragment View view = inflater.inflate(R.layout.fragment_photo, container, false); spnrThemes = view.findViewById(R.id.spnrThemes); spnrAims = view.findViewById(R.id.spnrAims); spnrGoals = view.findViewById(R.id.spnrGoals); setSpinner(spnrThemes, "Select Theme", ThemesAimsGoals.getThemes()); spnrThemes.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Object selectedItem = parent.getItemAtPosition(position); if (selectedItem != null) { mSelectedTheme = selectedItem.toString(); setSpinner(spnrAims, "Select Aim", ThemesAimsGoals.getAims(mSelectedTheme)); } else if(mSelectedThemeIdx != -1){ selectedItem = parent.getItemAtPosition(mSelectedThemeIdx); mSelectedTheme = selectedItem.toString(); setSpinner(spnrAims, "Select Aim", ThemesAimsGoals.getAims(mSelectedTheme)); parent.setSelection(mSelectedThemeIdx); mSelectedThemeIdx = -1; }//Else }//onItemSelected @Override public void onNothingSelected(AdapterView<?> parent) { } }); spnrAims.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Object selectedItem = parent.getItemAtPosition(position); if (selectedItem != null) { mSelectedAim = selectedItem.toString(); setSpinner(spnrGoals, "Select Goal", ThemesAimsGoals.getGoals(mSelectedTheme, mSelectedAim)); } else if(mSelectedAimIdx != -1){ selectedItem = parent.getItemAtPosition(mSelectedAimIdx); mSelectedAim = selectedItem.toString(); setSpinner(spnrGoals, "Select Goal", ThemesAimsGoals.getGoals(mSelectedTheme, mSelectedAim)); parent.setSelection(mSelectedAimIdx); mSelectedAimIdx = -1; }//Else }//onItemSelected @Override public void onNothingSelected(AdapterView<?> parent) { } }); spnrGoals.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { @Override public void onItemSelected(AdapterView<?> parent, View view, int position, long id) { Object selectedItem = parent.getItemAtPosition(position); if (selectedItem != null) { mSelectedGoal = selectedItem.toString(); }else if(mSelectedGoalIdx != -1){ selectedItem = parent.getItemAtPosition(mSelectedGoalIdx); mSelectedGoal = selectedItem.toString(); parent.setSelection(mSelectedGoalIdx); mSelectedGoalIdx = -1; }//Else }//onItemSelected @Override public void onNothingSelected(AdapterView<?> parent) { } }); return view; }//onCreateView //----------------------------------------------------------------------------------------// /** * Populate Spinner * @param spnr Spinner to populate * @param prompt What to show at the start * @param array Items in the spinner */ private void setSpinner(Spinner spnr, String prompt, String[] array) { spnr.setPrompt(prompt); ArrayAdapter<CharSequence> adapter = new ArrayAdapter(activity, android.R.layout.simple_spinner_item, array); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); spnr.setAdapter( new NothingSelectedSpinnerAdapter( adapter, R.layout.contact_spinner_row_nothing_selected, activity, prompt)); }//setSpinner //----------------------------------------------------------------------------------------// /** * Some lifecycle callbacks so that the image can survive orientation chang * * @param outState current state of fragment */ @Override public void onSaveInstanceState(Bundle outState) { Log.d(TAG, "onSaveInstanceState"); super.onSaveInstanceState(outState); outState.putInt(SELECTED_THEME_IDX_STORAGE_KEY, spnrThemes.getSelectedItemPosition()); outState.putInt(SELECTED_AIM_IDX_STORAGE_KEY, spnrAims.getSelectedItemPosition()); outState.putInt(SELECTED_GOAL_IDX_STORAGE_KEY, spnrGoals.getSelectedItemPosition()); }//onSaveInstanceState //----------------------------------------------------------------------------------------// /** * Rebuilds the Activity/Fragment in the image of the last one. * * @param savedInstanceState Info from last session or rotation */ @Override public void onActivityCreated(Bundle savedInstanceState) { super.onActivityCreated(savedInstanceState); Log.d(TAG, "onActivityCreated"); if (savedInstanceState == null) return; mSelectedThemeIdx = savedInstanceState.getInt(SELECTED_THEME_IDX_STORAGE_KEY); mSelectedAimIdx = savedInstanceState.getInt(SELECTED_AIM_IDX_STORAGE_KEY); mSelectedGoalIdx = savedInstanceState.getInt(SELECTED_GOAL_IDX_STORAGE_KEY); }//onActivityCreated }//Cls 的另一种解决方案:

data.table

结果:

library(data.table)
setDT(df)
df <- dcast(df, ID ~ Color)
df[,2:4 := lapply(.SD,function(x){ifelse(is.na(x),0,1)}), .SDcols = 2:4]